B-树
B-树,即为B树。
B树结点可以有很多子女,一颗含n个结点的B树的高度也为O(lgn),B树可以在O(lgn)时间内,实现各种如插入,删除等动态几何操作。
如下图所示,即是一棵B树,一棵关键字为英语中辅音字母的B树,现在要从树种查找字母R(包含n[x]个关键字的内结点x,x有n[x]+1]个子女(也就是说,一个内结点x若含有n[x]个关键字,那么x将含有n[x]+1个子女)。所有的叶结点都处于相同的深度,带阴影的结点为查找字母R时要检查的结点):
一颗m阶的B树满足下列条件:
1.每个节点至多有m棵子树。
2.除根结点外, 其它每个分支结点至少有⌈m/2⌉棵子树。
3.根节点至少有两颗子树(除非B树只包含一个结点)。
4.所有叶节点在同一层上。
5.有j个孩子的非叶结点恰好有j-1个关键码, 关键码按递增次序排列。
B-树特性
1.关键字集合分布在整颗树中;
2.任何一个关键字出现且只出现在一个结点中;
3.搜索有可能在非叶子结点结束;
4.其搜索性能等价于在关键字全集内做一次二分查找;
5.自动层次控制;
B+ 树
1.其定义基本与B-树同,除了:
2.非叶结点的子树指针与关键字个数相同;
3.非叶结点的子树指针P[i], 指向关键字值属于[K[i], K[i+1])的子树;
4.为所有的叶子节点增加一个链指针;
5.所有关键字都在叶子结点出现;
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4.更适合文件索引系统;
B*树
是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;
B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2);
B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;
B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;
所以,B*树分配新结点的概率比B+树要低,空间使用率更高;
小结
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;
所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:在B-树基础上,(1)为叶子结点增加链表指针,(2)所有关键字都在叶子结点中出现,(3)非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
B*树:在B+树基础上,(1)为非叶子结点也增加链表指针,(2)将结点的最低利用率从1/2提高到2/3;
参考:
1.大话数据结构;
2.B树、B-树、B+树、B树都是什么 - racoon的个人页面 https://my.oschina.net/surya/blog/16449