数据结构五之B+树

你看,像这个B树,B+树,数据库索引,这些基础,你在大学里都学过吧。。。。。。

放屁,大学里哪学过这些。------------你知道我是在讽刺我的大学吗?不过,我仍然对我的母校,爱的痴狂。

B+树

B+树是在B树的基础上,专为文件系统和数据库而出现的一种数据结构。

首先说一下B+树的定义。

对于一个m阶的B+树有如下定义:

1.根节点只有一个,根节点最多有m个子树,最少有2个子树。([2,m])

2.除根节点外,所有非叶子节点最多有m个子树,最少有m/2个子树。即:[ceil(m/2),m]

3.n个子树的非叶子节点有n个关键字(索引)。

4.所有的叶子节点都在同一层,所有的关键字都在叶子节点,且按照一定的顺序排列,关键字的数目最少是m/2,最多m。即[ceil(m/2),m].

5.B+树有两个头指针,一个指向根节点中最小的节点,另一个指向根节点。

如图 B+树:


图片是copy的别人的。http://blog.csdn.net/aqzwss/article/details/53074186。我自己作图实在是特别丑。

根据B+树的定义,可以知道B+树有如下特性:

所有的关键字都出现在叶子节点的链表中,且链表中的关键字恰好是有序的。

在查找的时候,不可能在非叶子节点中命中,因为非叶子节点中存储的都是索引。

如果想知道mysql为什么会选择b+树做索引,火箭直达:http://blog.codinglabs.org/articles/theory-of-mysql-index.html。

B+树的插入操作:(图片均为copy,大人有大量
有如下B+树:


第一种情况:插入新的值,没有破坏B+树:

如插入9:


检查是否破坏了B+树的性质。没有,那么直接插入。

第二种情况:

如插入20


发现【20,21,37,44】这个节点破坏了B+树的性质。那么就把这个节点拆分成【20,21】,【37,44】连个节点,并且把21抽取到父节点中。如图:


这时【15,21,44,59】仍然破坏了B+树的性质,将该节点拆分成【15,21】,【44,59】两个节点,并且将21抽取到父节点中。

如图:


第三种情况:

插入100:


这个时候,发现所有的父节点都比100要小,所以修改其父节点的值为100.


并且【85,91,97,100】这个节点,不符合B+树的性质,将91向上抽取,


不用作图,真的是很快啊。这个图,和第一章图有所差别,非叶子节点中记录的索引是数据的最小值。而实例中的图中索引是记录的最大值。原理一致。每次看到这,请记住,自己一定要在纸上画画图。

删除操作


第一种情况:删除数据后,对原B+树,没有影响。

如:删除91


第二种情况:删除97


修改其父节点的值为数据中的最大值(栗子中的是91)。看是否符合B+树的性质。

第三种情况:删除51.


这时,破坏了B+树的性质(叶子节点中的关键字数目[ceil(m/2),m])。将44合并到【59】节点中,并且将37抽取到父节点【15,44,59】中,即如下图:



第四种情况:

删除59



第五种情况:删除63







如果以上说话有错,劳请指正,非常感谢。

2018-03-20 方小白  畅游大厦


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方_小_白

谢谢金主子,记得关注方家小白哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值