B树 B+树 B*树 结构和区别
B树可以分成很多种,
B-树(通常也只称为B树)是一种多路搜索树(并不是二叉的):
1.定义任意非叶子结点最多只有M个儿子;且M>2;
2.根结点的儿子数为2到M个;
3.除根结点以外的非叶子结点的儿子数为M/2到M个;
4.每个结点存放至少M/2-1(取上整 5/2=2)和至多M-1个关键字;(至少2个关键字,关键字就是节点中存储的几个数据,用来进行检索)
5.非叶子结点的关键字个数=指向儿子的指针个数-1;
6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的
子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;(图中显示,这也是和B+树的区别)
8.所有叶子结点位于同一层;
如:(M=3)
![](https://images2017.cnblogs.com/blog/1225251/201709/1225251-20170917171826063-1730260966.png)
重点说一下B+树
有的B+树,在关键字存储上结构不同,比如,直接存储和子节点个数相同的关键字,每个关键字和子节点第一个数据相同
例如下图中,但是之后的这种是更流行的方式。
![](https://images2017.cnblogs.com/blog/1225251/201709/1225251-20170917171938297-17649502.png)
B+树的插入:
从根节点进行遍历,直到找到合适的位置进行插入。
![](https://images2017.cnblogs.com/blog/1225251/201709/1225251-20170917172042563-1061433509.png)
两者的区别:
![](https://images2017.cnblogs.com/blog/1225251/201709/1225251-20170917172240219-458355241.png)
面试题
![](https://images2017.cnblogs.com/blog/1225251/201709/1225251-20170917172400485-696946345.png)
B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。
所以,B*树分配新结点的概率比B+树要低,空间使用率更高;
应用
B-树主要应用在文件系统
为了将大型数据库文件存储在硬盘上 以减少访问硬盘次数为目的 在此提出了一种平衡多路查找树——B-树结构 由其性能分析可知它的检索效率是相当高的 为了提高 B-树性能’还有很多种B-树的变型,力图对B-树进行改进
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
原文链接
如有问题, 可邮件(zxy.hope@gmail.com)咨询.