图解 B+树的插入与删除操作

B+树的插入与删除操作

B+树和二叉树、平衡二叉树一样,都是经典的数据结构。B+树由B树和索引顺序访问方法(这也是MyISAM引擎最初参考的数据结构)演化而来,但是在实际使用过程中几乎已经没有使用B树的情况了。
B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。因此在进行插入删除操作时,要进行调整,维持其平衡性。
我们先来看一个B+树,其高度为2,每页可存放4条记录,扇出(fan out)为5,可以理解成5阶多叉树。
[外链图片转存失败(img-RIAuAm0L-1565857898331)(04img/001.png)]

插入操作

B+树的插入必须保证插入后叶节点中的记录依然排序,同时需要考虑插入B+树的三种情况,每种情况都可能会导致不同的插入算法,如下表所示。
[外链图片转存失败(img-AlQtbHUo-1565857898332)(04img/002.png)]
我们用实例来分析B+树的插入,我们插入28这个键值,发现当前Leaf Page和Index Page都没有满,我们直接插入就可以了。
[外链图片转存失败(img-RXdIH6sy-1565857898345)(04img/003.png)]
这次我们再插入一条70这个键值,这时原先的Leaf Page已经满了,但是Index Page还没有满,符合表5-1的第二种情况,这时插入Leaf Page后的情况为50、55、60、65、70。我们根据中间的值60拆分叶节点。
[外链图片转存失败(img-h3deQkMA-1565857898345)(04img/004.png)]
因为图片显示的关系,这次我没有能在各叶节点加上双向链表指针。最后我们来插入记录95,这时符合表5-1讨论的第三种情况,即Leaf Page和Index Page都满了,这时需要做两次拆分。
[外链图片转存失败(img-OvCN9SNA-1565857898346)(04img/005.png)]
可以看到,不管怎么变化,B+树总是会保持平衡。但是为了保持平衡,对于新插入的键值可能需要做大量的拆分页(split)操作,而B+树主要用于磁盘,因此页的拆分意味着磁盘的操作,应该在可能的情况下尽量减少页的拆分。因此,B+树提供了旋转(rotation)的功能。

旋转发生在Leaf Page已经满了、但是其左右兄弟节点没有满的情况下.这时B+树并不会急于去做拆分页的操作,而是将记录移到所在页的兄弟节点上。通常情况下,左兄弟被首先检查用来做旋转操作,这时我们插入键值70,其实B+树并不会急于去拆分叶节点,而是做旋转,50,55,55旋转。
![[外链图片转存失败(img-5lyJwIsz-1565857898349)(04img/006.png)]
可以看到,采用旋转操作使B+树减少了一次页的拆分操作,而这时B+树的高度依然还是2。

删除操作

B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因子可设的最小值。B+树的删除操作同样必须保证删除后叶节点中的记录依然排序,同插入一样,B+树的删除操作同样需要考虑如下表所示的三种情况,与插入不同的是,删除根据填充因子的变化来衡量。
[外链图片转存失败(img-qg4J25Q6-1565857898349)(04img/007.png)]
a)初始状态
[外链图片转存失败(img-bpObwdG3-1565857898352)(04img/008.png)]
b)删除22
[外链图片转存失败(img-0Ci7EA5G-1565857898354)(04img/009.png)]
c)删除15
[外链图片转存失败(img-DauNba3A-1565857898355)(04img/010.png)]
删除后当前结点只有一个key,不满足条件,而兄弟结点有三个key,可以从兄弟结点借一个关键字为9的记录,同时更新将父结点中的关键字由10也变为9,删除结束。
外链图片转存失败(img-MpGcDUrX-1565857898356)(04img/011.png)
d)删除7
[外链图片转存失败(img-Dl59I9He-1565857898357)(04img/012.png)]
当前结点关键字个数小于2,(左)兄弟结点中的也没有富余的关键字(当前结点还有个右兄弟,不过选择任意一个进行分析就可以了,这里我们选择了左边的),所以当前结点和兄弟结点合并,并删除父结点中的key,当前结点指向父结点。
[外链图片转存失败(img-cHHRC8Hn-1565857898358)(04img/013.png)]
此时当前结点的关键字个数小于2,兄弟结点的关键字也没有富余,所以父结点中的关键字下移,和两个孩子结点合并,结果如下图所示。
[外链图片转存失败(img-1VsVAvJA-1565857898358)(04img/014.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值