B和B+树
Posted 牧空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B和B+树相关的知识,希望对你有一定的参考价值。
B-树(就是B树)
Balance-Tree,多路平衡搜索树(并不是二叉)
条件
- 定义任何非叶子节点最多只能有 M M M个儿子,且 M > 2 M>2 M>2
- 根结点的儿子数为 [ 2 , M ] [2, M] [2,M];
- 除根结点以外的非叶子结点的儿子数为 [ M / 2 , M ] [M/2, M] [M/2,M];
- 每个结点存放至少 ⌊ M 2 − 1 ⌋ \\lfloor\\frac{M}{2} -1\\rfloor ⌊2M−1⌋和至多 M − 1 M-1 M−1个关键字;(至少2个关键字)
- 非叶子结点的关键字个数 = 指向儿子的指针个数-1;
- 非叶子结点的关键字: K [ 1 ] , K [ 2 ] , … , K [ M − 1 ] K[1], K[2], …, K[M-1] K[1],K[2],…,K[M−1];且 K [ i ] < K [ i + 1 ] K[i] < K[i+1] K[i]<K[i+1];
- 非叶子结点的指针: 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[M−1]的子树,其它 P [ i ] P[i] P[i]指向关键字属于 ( K [ i − 1 ] , K [ i ] ) (K[i-1], K[i]) (K[i−1],K[i])的子树;
- 所有叶子结点位于同一层;
充分利用关键字之间的空隙
例子
查询方式:从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;
特性
- 关键字集合分布在整颗树中;
- 任何一个关键字出现且只出现在一个结点中;
- 搜索有可能在非叶子结点结束;
- 其搜索性能等价于在关键字全集内做一次二分查找;
- 自动层次控制;
B+树
条件
其定义基本和B-树一样,除了:
- 非叶子节点的字数指针与关键字个数相同
- 非椅子节点的子树指针
P[i]
指向关键字值属于[K[i],K[i+1])
- 为所有叶子节点增加一个链指针
- 所有关键字都在叶子节点出现
特性:
- 所有关键字都出现在叶子节点的链表中(稠密索引),且链表中的关键字恰好是有序的
- 不可能在非叶子节点中命中
- 非叶子节点相当于叶子节点的索引(稀疏索引),叶子节点相当于存储(关键字)数据的数据层
- 更适合文件索引系统
B-和B+树的区别
B+树只有到达叶子节点才命中(B-树可以在非叶子中)
- B-树的叶子节点不包含任何信息,B+树的叶子节点包含信息(关键字及其记录等)
- B-树的叶子不会指向它的兄弟节点,B+树的叶子会指向它的兄弟节点
- B-树只能进行分区间查找,B+树可以进行顺序查找和分区间查找
- B-树上所有的非叶节点都满足有n个关键字的话有n+1棵子树,而B+树上所有的非叶节点包含n个关键字的只含n棵子树
B*树
B+树的变体,在B+树的非根节点和非叶子节点再指向兄弟的指针
将节点的最低利用率从1/2提高到2/3
参考
以上是关于B和B+树的主要内容,如果未能解决你的问题,请参考以下文章
你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...
你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...
你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...
你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...