B和B+树

Posted 牧空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B和B+树相关的知识,希望对你有一定的参考价值。

B-树(就是B树)

Balance-Tree,多路平衡搜索树(并不是二叉)

条件

  1. 定义任何非叶子节点最多只能有 M M M个儿子,且 M > 2 M>2 M>2
  2. 根结点的儿子数为 [ 2 , M ] [2, M] [2,M]
  3. 除根结点以外的非叶子结点的儿子数为 [ M / 2 , M ] [M/2, M] [M/2,M]
  4. 每个结点存放至少 ⌊ M 2 − 1 ⌋ \\lfloor\\frac{M}{2} -1\\rfloor 2M1和至多 M − 1 M-1 M1个关键字;(至少2个关键字)
  5. 非叶子结点的关键字个数 = 指向儿子的指针个数-1;
  6. 非叶子结点的关键字: K [ 1 ] , K [ 2 ] , … , K [ M − 1 ] K[1], K[2], …, K[M-1] K[1],K[2],,K[M1];且 K [ i ] < K [ i + 1 ] K[i] < K[i+1] K[i]<K[i+1]
  7. 非叶子结点的指针: P [ 1 ] , P [ 2 ] , … , P [ M ] P[1], P[2], …, P[M] P[1],P[2],,P[M];其中 P [ 1 ] P[1] P[1]指向关键字小于 K [ 1 ] K[1] K[1]的子树, P [ M ] P[M] P[M]指向关键字大于 K [ M − 1 ] K[M-1] K[M1]的子树,其它 P [ i ] P[i] P[i]指向关键字属于 ( K [ i − 1 ] , K [ i ] ) (K[i-1], K[i]) (K[i1],K[i])的子树;
  8. 所有叶子结点位于同一层;

充分利用关键字之间的空隙

例子

img

查询方式:从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;

特性

  1. 关键字集合分布在整颗树中;
  2. 任何一个关键字出现且只出现在一个结点中;
  3. 搜索有可能在非叶子结点结束;
  4. 其搜索性能等价于在关键字全集内做一次二分查找;
  5. 自动层次控制;

B+树

条件

其定义基本和B-树一样,除了:

  1. 非叶子节点的字数指针与关键字个数相同
  2. 非椅子节点的子树指针P[i]指向关键字值属于[K[i],K[i+1])
  3. 为所有叶子节点增加一个链指针
  4. 所有关键字都在叶子节点出现

img

特性:

  1. 所有关键字都出现在叶子节点的链表中(稠密索引),且链表中的关键字恰好是有序的
  2. 不可能在非叶子节点中命中
  3. 非叶子节点相当于叶子节点的索引(稀疏索引),叶子节点相当于存储(关键字)数据的数据层
  4. 更适合文件索引系统

B-和B+树的区别

B+树只有到达叶子节点才命中(B-树可以在非叶子中)

  1. B-树的叶子节点不包含任何信息,B+树的叶子节点包含信息(关键字及其记录等)
  2. B-树的叶子不会指向它的兄弟节点,B+树的叶子会指向它的兄弟节点
  3. B-树只能进行分区间查找,B+树可以进行顺序查找和分区间查找
  4. B-树上所有的非叶节点都满足有n个关键字的话有n+1棵子树,而B+树上所有的非叶节点包含n个关键字的只含n棵子树

B*树

B+树的变体,在B+树的非根节点和非叶子节点再指向兄弟的指针

img

将节点的最低利用率从1/2提高到2/3

参考

B树,B-树和B+树的区别

以上是关于B和B+树的主要内容,如果未能解决你的问题,请参考以下文章

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...

python+spark程序代码片段