前面一章总结了一下数据结构以及查找树和红黑树的一些知识点,现在接着上面的内容说一下我们常用的B树和B+树。
所以要想更加容易读懂这篇文章,必须要先点这里看看我们的上一章
先加个目录:
目录
1、B树
灵魂三问:何谓B树?B树的结构是什么?B树有什么优缺点?
1.1 何谓B树?
注意注意注意:B-树就是B树,不是B减树
B树就是一个有2-3树(查看上一章内容)的所有结构和原理的多阶查找树,又叫多路平衡查找树。定义一棵B树必须指定它的阶。
那么问题来了,什么是多阶查找树呢?阶是什么呢?
简单来说呢,一棵树中的每个节点可以拥有的最多子节点树就叫做 -- 阶。比如2-3树就是一个阶数为3的B树。
1.2 B树的结构是什么?
上一小节中我们已经说过了,2-3树就是一个阶数为3的B树,这么说,B树的结构就类似于2-3树喽。为什么说是类似呢?因为这里还有阶一说。那么如果阶数为4,为5的B树长什么样子呢?
其实就是每个节点最多能连接的子节点不一样而已,其他完全一样,包括保持平衡的逻辑。
这里是详细逻辑结构的 传送门 。就不仔细说了。
知道了结构我们就可以知道它的一些特性了。Look(假设这里的B树的阶为 m):
- 一棵B树的阶是预定义的(因为数据保存在磁盘中,通过磁盘页的大小决定阶的大小)
- 一棵B树的叶子节点总在同一层(因为它是平衡的,B树使用节点上移保证平衡)
- 一棵B树的所有节点上的数据个数等于其子节点个数减一(查看2-3树结构图)
- 一棵B树的所有中间节点的子节点个数k为: m/2 <= k <= m(因为数据插入只会发生在叶子节点,需要做平衡化的时候提取中间数据到上层,所以k>=m/2。具体根据结构理解)
- 一棵B树中的所有节点中的每个数据的左子树的所有数据小于等于该数据,右子树的所有数据大于等于该数据(数据有序便于二分查找)
1.3 B树有什么优缺点?
我们使用任何东西肯定是无利不起早,没有好处我们怎么会用,怎么会发明出来呢?说起B树的好处,往下看:
- 和二叉树相比较,因为我们的数据都是保存在磁盘中,我们读取的时候是需要消耗IO,而树的读取,我们一层需要读取一次IO。所以二叉树过于消耗我们的IO。而B树相对就会节省我们的IO。其实就是把“瘦高”的二叉树变成“矮胖”的B树。
当然任何东西都有两面性,B树也有:
- 和二叉树比较,我们每次操作一个节点的时候就需要去操作节点中的所有数据,相对于二叉树性能肯定有所不如。
总的来说,相比于这个缺点,内存要比磁盘快的多,所以对于消耗的一点内存交互来说,省下来的IO大大提高了树的性能。
1.4 B树的应用
- 文件系统
- 数据库索引,比如现在流行的非关系型数据MongoDB
2 B+树
既然说了B树,那么B+树也就不得不提了
那么,B+树为什么叫B+树呢?它与B树有什么不同呢?
2.1 什么是B+树?
B+树其实就是B树的一个升级版。相对于B树,B+树做了以下修改,大大提升了索引效率:
- 子节点保存父节点的值,父节点的值作为子节点的最大值或者最小值;
- 所有叶子节点包含了整棵树的所有值,并且它们之间使用指针相连,形成了一个有序列表;
- 只有叶子节点保存数据,其他节点都只保存索引(指针)。
所以B+树的结构是这个样子的:
2.2 B+树的优缺点?
B树的所有优点B+树全部都有。而且相对于B树还有一些新增的优点:
- 不保存数据在根节点和中间节点,所以可以保存更多的索引,从而支持树的阶数更大,从而比B树更加矮胖,可以省下更多的IO。
- 每次查询都必须从根节点遍历到叶子节点,查询性能相较于B树稳定(B树最优直接查询根节点,最差查询到子节点。)
- 范围查询直接遍历叶子节点就OK,B树需要遍历N次(N为满足条件数据量)
2.3 B+树的应用
- 数据库索引:典型的就是Mysql数据库。
暂时做一个总结,文章接着前面一章。觉得有疑问或者不正确的地方的,欢迎指正,一起学习,一起进步。有需要这些流程图资料的可以留言。