B-树的插入操作
看完你能亲手模拟插入全过程,解释每次分裂为何必要
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
B-树的插入操作
看完你能亲手模拟插入全过程,解释每次分裂为何必要
插入算法的三步曲
往字典里插一个新词,你先得翻到那一页;那一页写满了就得撕成两页、目录也跟着重排。B-树插入的骨架就是这三步:先定位、再分裂、最后回头修补上游。
翻页对应定位;撕两页对应分裂中位上提;目录也满继续撕对应递归
插入算法流程图
从顶部开始向下追:先找位,再插入;满则分裂上提,一路向上直至根。
分裂的触发条件
三步曲最后一步是'必要时分裂'——什么时候算'必要'?答:目标节点已持有 m-1 个键,再插就突破上限的瞬间。
满员后再来人调度新车,中位乘客转调度站对应中键上提
分裂的详细过程
箭头方向即分裂执行顺序;中位数上移既是分裂成果,也是触发父节点判断的条件。
分裂操作的伪代码
这段可链接的 C 实现展示 split_child:搬移满孩子的右半内容,再上提中位键并腾出父节点槽位。
高亮行先创建右节点、复制右半键/孩子并缩短左节点;随后右移父节点内容、插入新右孩子,再把左节点第 t−1 个键上提。前提是 t≥2、child[i] 已满且父节点未满。
分裂后的节点性质
分裂完成后,新生成的两个节点并不是「随便分一半」——它们的结构遵循严格的规则。我们来看看,分裂后左右节点各自拿到多少关键字、又能挂多少子树,以及这些数字之间藏着什么不变量。
原团队一半进新部门,组长升任上级管两边,两边都达到最小规模
为什么需要再分裂
上一页我们把满的子节点一分为二,中间键向上推到父节点。但这个「上推」动作可能撞上已经装满的父节点——这就是再分裂的根源。
下层满了往上塞,父层也满就再加一层柜子
连锁分裂的递归过程
从下往上看:插入触发叶子分裂,中间键上浮到父节点;父节点若也满了,分裂继续向上传播,直到根节点。
连锁分裂的复杂度分析
上一页我们看到分裂会沿着路径一路向上传,那它到底会传多远?我们先记住一个事实:B-树的高度天然就是 O(log_m n),这把连锁分裂的「天花板」钉死了。
袋子塞满就换大一号袋子往上交,最坏情况每个袋子都要换,但袋子层数本来就是对数个
根节点分裂的特殊性
上页连锁分裂一路把 key 上推到根,发现根也满了——可根没有父亲,递归到哪里结束?
分公司裂变只需把领导上报给公司;公司自己裂变则要新设集团总部
分裂到根的完整过程
从满根出发,沿因果链看根如何被劈开、新根如何诞生。
B-树高度增长的规律
上一页我们完整看了根分裂的过程。现在跳出细节看整体:B-树变高是一件罕见的事,但一旦发生,所有叶子会集体下沉一层;而插入的均摊代价并不会因此恶化。
只有 CEO 办公室(根)挤不下才盖新楼,部门扩张只换大办公室不加层
实例1:首次分裂触发
m=3 的 B-树从空树建起,第三次插入时首次触碰上限,分裂由此触发。
实例2:连锁分裂
插入遇满节点要先分裂;若上层也满,分裂会一路向上传,直到根。
实例3:分裂到根
上次连锁到根就停,这次把根也拆开——这是 B 树长高的唯一方式。
实例4:复杂插入序列
随机序列会让多种分裂情形串成一条完整路径,从无分裂一路走到根分裂。
自测题
检验插入算法核心理解
核心要点总结
- ✓分裂是预防性的:满之前就主动拆,而非满了才被动修
- ✓分裂沿祖先链向上递归传播,单次插入可能引发级联
- ✓高度仅在根分裂时 +1,阶跃式增长,远慢于 BST
- ✓分裂是保形变换,所有 B-树不变量在变换前后恒成立
课后思考
先自己想,再看参考答案——三个层次,逐步深入。
参考答案若延迟分裂,下层节点键数将超过 m-1,破坏B-树定义的不变量,且查找路径也无法保证正确。
参考答案t=2时节点最少仅1键,利用率下限约50%,树高更大、磁盘I/O更多;t 越大利用率越高(约 2t/(2t+1)),但单节点变大。
参考答案B+树分裂需把键复制到两侧节点;分裂后同一键同时存于父节点与子节点,出现冗余存储——因为B+树内部节点也要靠键做索引。