数据结构--B树

目录

回顾二叉查找树

如何保证查找效率

B树的定义

提炼

B树的插入和删除

概括B树的插入方法如下

 B树的删除

导致删除时,结点不满足关键字的个数范围时(需要借)

如果兄弟不够借,需要合体

回顾B树的删除

B+树

B+树的查找

回顾B+树

B+树与B树对比


回顾二叉查找树

                          --能不能变成m叉查找树呢?

比如5叉查找树

紫色的是失败结点,每个子树内关键字结点都是有序的

比如查找目标是9(查找成功的情况)

比如查找目标是(查找失败的情况)

对于查找失败就是最后找到的是NULL

如何保证查找效率

策略:m叉查找树,除了根节点外,任何结点至少有 m/2 (向上取整)个分叉,即至少有m/2(向上取整)-1个关键字

为什么要除了根节点呢?原因如下:

所以如果可以规定一个下限,(1)分叉不是特别少,(2)同时高度都要相同(即绝对平衡

满足这两个条件那么就是一颗B树

如下图就是一颗5叉的B树

接下来是时候展示B树的定义了!!!!!!!!

B树的定义

提炼

(自己可以容易理解的整理)

绝对平衡,是没有高度差的

终端结点:包含信息

叶子结点(本质就是失败节点,它是个空指针):不包含信息

分叉个数最多的就是阶,图中分叉最多是5个,所以是5阶

2)若根节点不是终端结点,则至少有两颗子树的原因:是保证绝对平衡,没有高度差

5)所有叶结点都出现在同一层原因:是保证绝对平衡,没有高度差

4)K是关键字,P是指针,n是记录实际关键字到底有几个;K1<K2<....Kn是说关键字必须有序(这里是递增,也可以递减,只要有序即可)

最小高度的计算

最大高度的计算

B树的本节总结

B树的插入和删除

以5阶的插入来演示过程

依次放 25,38,49,60,

放80,导致关键字超出了4个

此时要进行分裂

新元素一定是插入到最底层“终端结点”,用“查找”来确定插入位置

插入要保证这个结点的左边结点要比其小,右边要比关键字大

接着插入90

90的正确的插入位置应该如下,接着插入99

接着插入88

所以插入88的结果如下

接着插入70,83,87肉眼可见往最低层插入,发现出现了溢出,将关键字[m/2]向上取整)分成两部分即87位置

即最终插入80的位置如下

接着插入如果导致父节点也出现溢出,接着分裂,直至传到根节点为止。

 

概括B树的插入方法如下

 B树的删除

(1)删除60

删除结果如下

如果删除80结点,会导致根结点为空

方法找直接前驱或者直接后继

此时用直接前驱70替代了80的位置,如下图

找直接前继的发法:关键字左侧指针所指子树中“最右下”的元素

接着删除77,如果利用77的直接后继,替代删除的元素77

找直接后继的发法:关键字右侧指针所指子树中“最左下”的元素

非终端结点关键字的删除,必然可以的转化为对终端结点的删除操作

导致删除时,结点不满足关键字的个数范围时(需要借)

比如删除38后,导致结点不满足关键字的个数范围2<=n<=4时,需要借,如果借右兄弟

删除结果如下

删除90后,导致关键字只剩下92,不在范围内,同时右兄弟手头紧张时,现象如下

左兄弟 

92的前驱所连指针是88,88前驱是左孩子的最右边结点87,用88插入到92前面,再用87替代88位置,

删除92后的最终结果B树是

关键:

要永远保证   子树0<关键字1<子树1<关键字2<子树2<

如果兄弟不够借,需要合体

如果删除49后形成如下情况,左右兄弟不够借

开始合并,但是要永远保证   子树0<关键字1<子树1<关键字2<子树2<,从父节点要来70,但是导致父节点又不够了

接着合并

 

删除最终的结果如下:

回顾B树的删除

B+树

上一层的一个关键字是其子树对应的最大值,比如叶子结点中1,3,最大的的是3,所以的父节点的一个关键字是3。接着叶子结点6,8,9最大的的是9,所以的父节点的另一个关键字是9,同理,从下往上找最大的值,作为上一层的一个关键字

注意的点:

3)重点:B+树的结点的子树个数与关键字个数相等

而B树如果有2个关键字是有3个子树的,如下图

4)叶子结点是整个的一块,比如47,48,50,56这个整体,并不是里面的某一部分,所以一个叶子结点可能包含m个关键字

 B+树的查找

方式(1)

通过根节点往下查找,但是必须找到最下层,即叶子结点才可以,因为叶子结点才记录信息

 

方式2

可以从保存的指针p,查找

 

回顾B+树

 

B+树与B树对比

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139875.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ant Eclipse插件使用

Eclipse默认带了ant插件 编辑build.xml文件给出提示 编辑的时候&#xff0c;会给出提示&#xff0c;方便编辑&#xff1a; 将鼠标放在属性上方&#xff0c;会将属性的值显示出来&#xff1a; 在Eclipse中运行ant 运行默认的target build.xml文件的内容如下&#xff0c;…

Unity DOTS System与SystemGroup概述

最近DOTS终于发布了正式的版本, 我们来分享以下DOTS里面System关键概念&#xff0c;方便大家上手学习掌握Unity DOTS开发。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; System是迭代计算与处理World中的…

【JVM】对象内存布局

对象内存布局 文章目录 对象内存布局1. 对象的内存布局2. 对象标记(Mark Word)3. 类元信息(类型指针)4. 实例数据和对象填充 1. 对象的内存布局 在Hotspot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头(Header)、实例数据(Instance Data…

win11 电脑 使用 python 连接USB 海康工业相机 运行示例程序 BasicDemo.py

win11 电脑 使用 python 连接USB 海康工业相机 运行示例程序 BasicDemo.py 1.下载海康的mvs客户端和mvs_sdk驱动 官网链接&#xff1a; https://www.hikrobotics.com/cn/machinevision/service/download?module0 下载这两个东西&#xff0c;然后安装 1.1 我的mvs安装在 F:\…

我的创作一周年纪念日

目录 机缘收获憧憬 机缘 还真是,像极了<<匆匆>>里的那一段话. “聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢&#xff1f;是他们自己逃走了罢&#xff1a;现在又到了哪里呢&#xff1f;” 一年的光景就这么过去了…

电厂如何通过PHM提高设备运行可靠性

故障预测与健康管理&#xff08;PHM&#xff09;作为一种先进的技术手段&#xff0c;正在被广泛应用于各个行业&#xff0c;包括发电厂。PHM利用数据收集、分析和利用的方法&#xff0c;可以实现设备状态的实时监测、故障预测和健康评估。本文将介绍PHM的概念和发展现状&#x…

音视频开发岗位,2023年为何持续增加?如何应聘音视频岗位

随着基础设施的完善&#xff08;光纤入户、wifi覆盖、5G普及&#xff09;&#xff0c;加之2020年疫情的影响&#xff0c;将短视频、直播、视频会议、在线教育、在线医疗瞬间推到了顶峰&#xff0c;人们对音视频的需求和要求也越来越强烈。音视频开发是指利用计算机技术和相关编…

Spring framework Day22:Aware接口

前言 在Spring框架中&#xff0c;有许多接口和类都有一个非常重要的作用——让我们能够更方便地构建应用程序和管理组件。其中&#xff0c;Aware接口就是其中一个非常重要的接口之一。通过实现该接口&#xff0c;我们可以让Spring容器感知到特定的组件和资源&#xff0c;并进行…

OJ第四篇

文章目录 链表分割环形链表有效的括号 链表分割 链接: 链表分割 虽然这个题牛客网中只有C,但是无所谓&#xff0c;我们只要知道C是兼容C的就可以了 至于说这个题的思路&#xff0c;我们就弄两个链表&#xff0c;把小于x的结点放到一个链表中&#xff0c;剩下的放到另一个链表…

从实时数据库转战时序数据库,他陪伴 TDengine 从 1.0 走到 3.0

关于采访嘉宾 在关胜亮的学生时代&#xff0c;“神童”这个称号如影随形&#xff0c;很多人初听时会觉得这个称谓略显夸张&#xff0c;有些人还会认为这是不是就是一种调侃&#xff0c;但是如果你听说过他的经历&#xff0c;就会理解这一称号的意义所在了。 受到教师母亲的影…

SpringCloud学习笔记-gateway网关自定义全局过滤器

需求&#xff1a;定义全局过滤器&#xff0c;拦截请求&#xff0c;判断请求的参数是否满足下面条件&#xff1a; 参数中是否有authorization&#xff0c; authorization参数值是否为admin 如果同时满足则放行&#xff0c;否则拦截 实现&#xff1a; 在gateway中定义一个过…

ScaleButton缩放按钮的实现基于javascript,typescript的代码-复制即用

调用方法 newChestInstance(sp:cc.SpriteFrame,pos:cc.Vec3){var node = new cc.Node("New Sprite");var sprite = node.addComponent(cc.Sprite);node.parent = this.canvasRoot;sprite.spriteFrame = sp;sprite.node.position = pos;node.addComponent(ChestView);…