B树和B+树

参考:
https://www.cnblogs.com/guohai-stronger/p/9225057.html

.B树(中间节点是包含数据的)
  1. 插入:
    插入的点一定是先到叶节点的
    (1)如果叶节点的元素个数没满,那么直接插入即可
    (2) 如果叶节点元素个数满了,那么先将元素插进去排好序以后开始分裂节点,取排好序的中间元素为分裂点,并将该元素送到父节点去,其他两部分被分开。如果父节点也是满的,那么就要按照这种方式递归进行,最差的情况是根节点也满了,那么就多加一层。比如没个节点最多4个元素,当插入后成了(1,3,5,6,7),那么就需要分裂变成(1,3)和(6,7),中间元素5被送到父节点去作为(1,3)和(5,7)的分割

  2. 删除:
    (1)如果删除的是叶子节点的元素:
    <1> 如果删除以后叶子结点元素个数还大于等于半满状态,那么直接删除即可;
    <2> 如果删除以后叶字节点个数小于半满状态,那么他就需要从其他地方借元素:
    {1} 如果兄弟节点(左边的兄弟)借给它一个元素以后还是大于等于半满状态,那么就借给它,但是借给他以后会导致父节点里对应的分割点不对(假设两个节点分别是A和B,那么分割点应该大于A的最后一个元素,小于B的第一个元素,现在A的最后一个元素给了B,此时不满足B的所有元素大于分割点),因此还需要将分割点和借过来的元素换位置。比如:A(1,3,5,7)B(12)A,B在父节点的分割元素是9,A将7借给B以后,B变成了(7,12)。但是这时候7小于分割点9,因此将7和9互换,此时分割点变成了7,B变成了(9,12)。满足条件
    {2} 如果兄弟节点借给他以后自己处于小于半满状态,那么就不能给他借,这个时候需要从父节点去借,即将父节点里对应的分割元素拿下来放到自己节点上,此时A和B的分割点没有了,将A和B合并成一个。比如A(1,3)B(7)分割点是5,那么B把分割点拿下来得到(5,7),然后和A合并变成(1,3,5,7)

    (2)如果删除的是中间节点,那么将该节点删除后需要将左孩子的最后一个元素或者右孩子的第一个元素拿过来补位(作为分割点),此时如果拿过来以后孩子节点不满足半满状态了要按照(1)-<2>里的方法去调整。比如A为(23,24,26)B为(28,29),父节点的分割点为27,现在要将分割点27删掉,那么父节点就从A或者B拿元素,可以拿A里的26,此时就变成了A(23,24)B(28,29),分割点26,满足条件终止。也可以拿B里的28,分割点变成了28,B就变成了(29),不满足半满状态,因此需要从A里借元素26,得到A(23,24)B(26,29),最后还要讲分割点和换的元素换位,得到分割点为26,B为(28,29)终止。

. B+树(中间节点不包含数据所有数据都在叶子结点里)

1.插入
和B树类似,只不过因为B+树的中间节点不包含数据(即中间节点只记录分割的值),因此当分裂的时候每次都将第二个节点的第一个元素传给父节点,但是自己也保留该节点。比如
(1,3,4,5,7)要分裂,如果是B树会变成(1,3)和(5,7)父节点的分割点为4。但是B+树会变成(1,3)和(4,5,7)父节点是分割点是4

2.删除
和B树类似,只不过B+树的删除不存在删除中间节点的情况,更加简单。

为什么不用二叉树而用B+树做索引:
数据库索引是存储在磁盘上,当表中的数据量比较大时,索引的大小也跟着增长,达到几个G甚至更多。当我们利用索引进行查询的时候,不可能把索引全部加载到内存中,只能逐一加载每个磁盘页,这里的磁盘页就对应索引树的节点。
也就是说对于相同的索引数据量,节点越少则磁盘IO就越少,性能就越好,也就是说树越矮越好,那么如果让树变矮呢,就是让树变成多叉树(即一个节点不只是存一个元素,而是存很多个)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值