当前课程知识点:数据结构(下) > 第八章 高级搜索树(下) > (b4)B-树: 插入 > 08B4-1 算法框架
在了解了B树的查找算法及其效率之后
接下来一个自然的问题就是
B树的动态操作 又当如何高效的实现
以下 我们首先来讨论它的插入算法
假设经过查找
我们确定需要在这个节点的这两个关键码之间
插入一个新的关键码
也就是说 从逻辑上看
这个节点需要变成上面这样的一个形式
这个深色的节点正是我们希望插入的关键码
那么 这样一个转换的过程应当如何实现呢
我们来看一种可能的实现方法
首先 我们要调用B树的查找算法 并且不妨假设
经过查找之后 可以确定该关键码尚不存在
于是根据我们的语义约定
这次查找最后应该终止于一个由_hot所指向的真实节点
你应该记得 _hot所指向的应该是位于最底层的一个叶节点
也就是图中的这个节点
于是接下来 我们进一步在这个节点的关键码向量中查找
以确认新的关键码究竟应该插入在哪个原有关键码的后边
请特别注意 这里的search是向量的接口
而这个search 则是B树的查找接口
于是 根据向量查找操作的接口语义
它的确会返回不大于目标关键码的那个最大的关键码
因此 如果返回的秩为r
我们自然就应该将新的关键码
作为第r+1个元素 插入向量当中
从图中所示的逻辑次序而言
也就是 紧随于插入位置之后 插入在这里
在关键码增加一个之后 分支数也需要相应的增加一个
你应该还记得 我们建议的画法
也就是让关键码向量
与分支引用向量 如此交错的对齐
如此 便可清晰明了地显示
每个关键码及其对应的左右分支
这里 为了理解的方便 我们不妨认为
因为这个新的关键码的插入 而引入的新的分支
就是该关键码的右侧分支
这也是为什么我们在r+2的位置上插入一个新的分支
当然 新的这个分支目前为空
其实 稍加观察 不难发现
既然此时的这个节点 是位于底层的叶节点
因此 其下属的分支
无论是此前的 还是新引入的 都应该是空
因此 一种更为简明的方法是
直接在分支向量的最后插入一个空分支
这种方法 与这里给出的方法完全等效
只不过稍微费解而已
接下来 如果没有什么特殊情况发生
我们只需动态的更新全树的规模 即可成功的返回
然而不幸的是 在引入了一个新的关键码之后
当前这个节点 可能会违反B树的约定
也就是因为其下属的分支增加了一个
从而导致分支总数超过了B树的阶次m
因为新关键码的引入
而导致所属节点的分支数超过B树阶次的情况
称作上溢 overflow
这样的一种非法情况 必须及时处理
为此 我们需要借助一种技术 称作分裂
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试