B-树B+树B*树

Posted 黑桃_K_

tags:

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

B树

M
1.根节点关键字的数量 [1,M-1]
2.根节点孩子的数量 [2,M]
3.非根节点关键字的数量 [M/2-1,M-1]
4.非根节点孩子节点的数量 [M/2,M]
5.一个节点中关键字按升序排列,孩子数量比关键字数量多1
6.所有叶子节点都在同一层,k[i[ k[i+1] 之间孩子中值大小在 k[i] k[i+1]

// M叉树:即一个节点最多有M个孩子,M-1个数据域
// 为实现简单期间,数据域与孩子与多增加一个(原因参见上文对插入过程的分析)
template<class K, int M = 3>
struct BTreeNode

 K _keys[M]; // 存放元素
 BTreeNode<K, M>* _pSub[M+1]; // 存放孩子节点,注意:孩子比数据多一个
 BTreeNode<K, M>* _pParent; // 在分裂节点后可能需要继续向上插入,为实现简单增加parent域
 size_t _size; // 节点中有效元素的个数
 BTreeNode()
 : _pParent(NULL)
 , _size(0)
 
 for(size_t i = 0; i <= M; ++i)
 _pSub[i] = NULL;
 
;

B+树

B+树是B树的变形,也是多路搜索树

1.其定义基本与B-树相同,除了:
2.非叶子结点的子树指针与关键字个数相同
3.非叶子节点的子树指针 p[i],指向关键字值属于 k[i],k[i+1] 的子树
4.为所有叶子节点增加一个链指针
5.所有关键字都在叶子节点出现


KV结构的B+树的规则和优点:
1.根节点k和孩子的数量都是 [1,M]
2.非根节点kv和孩子的数量都是 [M/2,M]
3.每个节点中关键字数量和孩子数量一样
4.一个节点中关键字按升序排列,且sub[i]中所有的值的大小在 k[i] k[i+i]之间
5.所有kv都要存在叶子结点中,非叶子只存k。父亲存的k是所有孩子的最小k
6.所有叶子都被链接起来,还有一个指针指向第一个叶子
优缺点:
1.B+树任何一个值都要走到叶子节点
2.B+树方便遍历,因为所有值都在叶子,叶子是链接起来的

B*树

变化:(提高空间利用率)
1.非叶子节点也链接起来了
2.非根节点的关键字和孩子的数量 [2/3M,M]
相比B+树,把非叶子节点的关键字个数(2/3
M) (代替了B+树的M/2)

总结:

B+树效率这么高是否可以替代红黑树和哈希表?
可以,但是一般不这样用,因为内存中红黑树和哈希表的效率已经足够高,B+树没有明显效果提升,其次就是B+树的空间浪费可能很多,他们的节点只有一半的利用率。

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

二叉树,B树,B+树,红黑树 简介

B 树 B+树

B 树 B+树

B 树 B+树

B 树 B+树

数据结构复习:B树/B+树