当前课程知识点:数据结构(下) > 第八章 高级搜索树(下) > (b4)B-树: 插入 > 08B4-5: 实例演示
接下来 我们就通过几个实例加深对B树算法过程的理解
首先 请确认这是一棵4阶B树
其特点是 每个节点的分支数至多是4 至少是2
或者等价的 每个节点所包含的关键码数 至多为3 至少为1
首先 假设我们要插入555 经简单目测 不难发现
应该将其紧邻于556 插入于这个节点之中
是的 经过逐层查找 可以确定待插入的位置
接下来 我们也的确只需将555紧邻于556的左侧
插入于这个节点之中
现在 我们来检查一下
尽管这个节点增加了一个关键码
但关键码的总数依然不超过4阶B树所对应的上限
这就意味着这次插入操作顺利结束
以下 我们再假设需要插入关键码444
经简单的目测 不难发现
应该将其紧邻于435的右侧 插入于这个节点之中
是的 我们的确可以通过查找 确定这个节点的位置
并的确如我们所预期的 将其紧邻于435的右侧
插入于这个节点之中
然而 与刚才的情况不同的是
当前这个节点 在接收了444之后
其所含关键码的总数已经超过上限3
也就是说 此时发生了上溢
根据我们修复上溢的算法
此时应该以其中的中位数关键码为界 将这个节点一分为二
同时 中位数关键码提升一层
并纳入到父节点 也就是这个节点的适当位置
当然 在父节点接纳了一个新的关键码之后
我们依然要对它再进行一次核对
所幸的是 它依然是合法的
再接下来 我们假设需要插入500
整个过程是 我们首先通过查找 确定这个节点
并且相应地 将500插入于482与511之间
接下来 我们同样会发现这个节点因此发生了上溢
为修复这一缺陷 我们依然故伎重演
也就是 以中位数关键码511为界 将这个节点一分为二
同时 511提升一层 插入于父节点中的适当位置
至此 尽管底层的上溢缺陷 得到了修复
但父节点却因为额外接纳了一个关键码 而随即发生上溢
当然 在这种情况下 我们依然可以如法炮制
继续在此做一次分裂操作
同样的 我们可以看到
刚才那一层上 所出现的上溢缺陷 得到了修复
然而遗憾的是 再上一层的父节点
也就是此时的根节点 也随即发生了上溢
当然 在这时 我们也依然需要对这个节点 做一次分裂操作
请注意 刚才的那个中位数关键码 虽然因此得以提升一层
但是因为此前已经是树根 它并没有实质的父节点
因此 这时的处理方法就应该是
让这个被提升的关键码独自成为一个根节点
而整棵树的高度 也因此增加了一层
我们讲过 这也是B树得以长高的唯一可能
至此 关键码500的插入过程 才得以最终完成
尽管我们这里展示了一个 因为某关键码的插入
而需要不断分裂 并一直持续到根的所谓最坏情况
但是需要指出的是 这种最坏情况出现的概率其实非常非常的低
其概率之低远远超出了你的直观想象
关于这一方面的分析 你不妨参考我们所提供的习题解析
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试