B+树

定义

M阶B+树定义:

在这里插入图片描述
tip : M阶非叶子节点儿子至多M个,即节点中关键字key最多M-1个

M与L取值问题

每个节点代表一个磁盘区块,假设一个磁盘区块存4096字节数据,因此根据存储项的大小选择M和L.
先有一user表,id为主键索引16个字节,一条记录record 32字节,指向下一个节点的指针next为2字节,先根据id建立索引.
那么一个节点中最多存的id个数为M-1:
在这里插入图片描述
即一个节点最多228个儿子,最少114个儿子.一个节点中最多227最少113个id.

一个节点总最多存放的记录record 为L个:
在这里插入图片描述

即一个节点中最多存128条,最少64条记录.

对于6.4亿条数据,最多1000万个叶子节点,最少500万个
在这里插入图片描述
下面举例为5阶B+树,M为5与L为4

插入操作



 1. 若为空树,创建一个叶子节点,然后将记录插入其中,此时这个叶子节点也是根节点,插入操作结束.
 2. 根据key找到叶子节点,向这个叶子节点插入记录.插入后若叶子节点key小于等于m-1,插入结束;否则以中间key进行分裂,并将key进位到父节点.如果父节点key个数小于等于m-1结束操作.否则下一步
 3. 再以中间key进行分裂,并将key进位到父节点,最差的情况一直回溯到根节点分裂,树高度+1.

举例5阶B+树的插入

带蓝色的节点为叶子节点,其中叶子节点带值,非叶子节点只有key为索引节点
根据定义5阶B树一个节点中最多4个key,最少2个key.
1. 插入50,55,60,65

在这里插入图片描述

 2. 插入70

在这里插入图片描述

 3. 插入35,40,45,75,80

在这里插入图片描述

 4. 插入56,57,85,90

在这里插入图片描述在这里插入图片描述
5. 插入41,42,51,52,58,66,67.76.77.91在这里插入图片描述
6. 插入43,53,59,68,78,92,93,94在这里插入图片描述

删除操作

删除的值一定在叶子节点中!

 1. 如果删除后叶子节点中的key数量大于等于Math.ceil(m/2)-1,
 则结束操作.否则进行下一步
 2. 如果删除后叶子节点的key数量小于Math.ceil(m/2)-1,
 **如果**兄弟节点的数量大于Math.ceil(m/2)-1,那么可
 以向兄弟节点借一个key,并更新父节点中对应的索引值.结束
 操作. **否则**进行下一步
 3. 合并兄弟节点删除父key.如果父索引节点中key个数大于
 等于Math.ceil(m/2)-1,那么结束操作.否则进行下一步
 4. 如果索引节点A的兄弟节点个数大于Math.ceil(m/2)-1,
 那么可以向祖父节点借一个key,祖父节点再向索引节点A的兄
 弟节点借一个key.即以祖父key为根节点进行旋转,否则进行
 下一步
 5. 合并索引节点的兄弟节点.

举例5阶B+树的删除

5阶B+树
在这里插入图片描述

1.删除50.

在这里插入图片描述
在这里插入图片描述

2.删除42.由于兄弟节点中key的数量都为2,因此合并兄弟节点(35,40)

在这里插入图片描述
合并后索引节点中key的数量为1,不满足条件,且索引节点的兄弟节点中的key数量为2,因此合并索引节点的兄弟节点
在这里插入图片描述
合并索引节点后
在这里插入图片描述

3.删除60.  60位于索引节点上,
因此先找到60的后继key为65替换60,
再删除叶子节点上的60.

在这里插入图片描述

4.删除68,兄弟节点key个数均为2,因此合并兄弟节点

在这里插入图片描述
合并后,父索引节点中的key数量为1.不满足条件.而父索引节点的兄弟节点中的key大于2,因此可以选择向祖父索引节点借key,祖父节点向父索引节点的兄弟节点借key.即以76为根进行左旋操作
在这里插入图片描述
旋转后:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值