菜鸡笔记——B-+树小结

好久没更新了,最近期末考复习看到B树突然觉得全忘了,后来花了一个上午的时间查博客、问老师,总算稍微弄懂了一些。接下来稍微总结一下。

为什么要有B树?

学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢?
这个要从几个方面来说了:

(1)计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。

(2)所以当你用红黑树的时候,你一次只能得到一个键值的信息,而用B树,可以得到最多M-1个键值的信息。这样来说B树当然更好了。

(3)另外一方面,同样的数据,红黑树的阶数更大,B树更短,这样查找的时候当然B树更具有优势了,效率也就越高。

注意B-树不是读作“B减树”,它是“B-tree”的缩写,“-”不是减号。B+树出现之后,一般B-树都简写成B树了

而B+树,顾名思义,是B-树的plus,也就是升级版本,在各方面都比B-树性能更好。

B树

1.定义

B树说到底是一种多路平衡查找树。对于一个m阶B树,它有如下定义:

  1. 根节点至少有两个子节点 ;

  2. 每个节点有m-1个key,并且以升序排列 ;

  3. 位于m-1和m key的子节点的值位于m-1 和m key对应的Value之间 ;

  4. 其它节点至少有m/2个子节点 ;

  5. 所有叶子节点都在同一层 。

m阶B树的意思就是对于每一个非根节点,它的度数最大为m,最小为⌈m/2⌉, 而指向孩子节点的指针是存放在两个key之间的,因此每个非根结点键值个数为度数-1,最大为m-1,最小为⌈m/2⌉-1.而对于根节点,它只需要保证在有孩子的情况下(只有一个根节点也算B树),度至少为2就行。

2.操作

有关于B树的操作,有查找、插入、删除。当插入结点键值数量超过m阶的定义时,需要进行分裂,可能会使B树高度增加;当删除结点之后键值数量小于m阶的定义时,需要进行合并,可能会使B树高度降低。

具体操作可以详见这篇博客,我觉得写的很详细:
B树和B+树的操作详解

有关于插入、删除的操作可以跟着博客的思路自己写一写、画一画,其实蛮简单的。B树很多都是考研的选择题,只要懂这个数据结构就可以了。

B+树

1.定义

不同地方对于B+树的数据结构的定义都有不同,这里选用《数据结构与算法分析》上采用的结构:

  1. 非叶子结点的子树指针与关键字个数相同;

  2. 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

  3. 为所有叶子结点增加一个链指针;

  4. 所有关键字都在叶子结点出现。

和B树不同,B+树每一个结点的每一个键值有一个指向孩子结点的指针,而不是键值之间存放指针,因此m阶B+树结点最多有m个键值,最少为⌈m/2⌉个(根节点最少为2个)。B+树的非叶子结点只包含索引信息,即其孩子结点键值中的最大/最小值,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。所以B+树是可以做到顺序查找的。
由于非叶节点只包含数据的索引,真正的数据全部存放在叶子节点,因此B+树比B树显得更加“矮胖”,查找效率也更高。
B+树在内部节点上不好含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子几点上关联的数据也具有更好的缓存命中率;
B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

2.操作

有关于B+树的操作和B树的思维基本一样,具体操作这里也不多说,由于很对地方对于B+树数据结构定义不同,所以操作会略微不同,这里选了一篇采用我上面介绍的数据结构的B+树的操作讲解:

B+树及插入和删除操作详解


补充:什么是2-3树?
2-3树一般是指最简单的B-树结构,即3阶B-树,其每个非叶节点都有两个或三个子女。2-3树不是二叉树,其节点可拥有3个孩子。不过,2-3树与满二叉树相似。高为h的2-3树包含的节点数大于等于高度为h的满二叉树的节点数,即至少有2^h-1个节点。
很多考研选择题都会考到2-3树,解法要类比二叉树的性质,因为2-3树和满二叉树很相似,满二叉树就是一棵特殊的2-3树。

混合结构的B-+树

很多地方对于B+树的数据结构定义皆有不同,有一种定义结构十分特殊,是采用了B-和B+树混合结构。即叶子节点为B+树结构定义,非叶子节点为B-树结构定义。
例如:

前面说了2-3树一般而言是指3阶B-树。这道题目说这棵树是2-3树,却混合了B+树(叶子结点)。
其实除了叶子节点,这棵树就是2-3树,也就是3阶的B-树,叶子节点有点特殊,采用了3阶B+树结点的定义。也即这是一棵混合结构的B-+树。
但是具体操作还是一模一样样的,如果看懂了我前面推的两篇博客,做这道题目还是很简单的。

第一步:插入18之后,叶子节点中包含了15、16、17、18四个键值,超出了m阶B+树的结点定义,因此分裂为两部分,分别为15、16还有17、18,并将中间值17分裂到上层节点。这一步对叶子节点的操作符合B+树插入、分裂的步骤
第二步:由于17分裂到上层节点,因此上层节点包含了11、15、17,超出了m阶B-树的结点的定义,因此以15为中间值分裂,15分裂到上层。这一步对于非叶节点的操作符合B-树的分裂步骤
在这里插入图片描述
最后这棵混合树的结构呈现如下:
在这里插入图片描述
以上就是对于B-、B+树一些概念和简单操作的小结。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值