B-树就是B树(二分查找法)
目录
引言
疑问:二叉树的查找时间复杂度是O(log N),查找效率已经够高了,为什么还有B树与B+树的出现呢?难道它俩的时间复杂度比二叉树还小吗?
当然不是,B树与B+树出现的原因是因为磁盘I O;I/O操作效率低,在大量数据中查询时,我们不可能一下子将所有数据加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点。
平衡二叉树由于树深度过大而造成磁盘I O读写过于频繁,进而导致效率低下。
为了减少磁盘IO次数,就必须降低树的深度,将“瘦高”(平衡二叉树)的树变得“矮胖”(B树)。基本想法是:
- 每个节点存储多个元素
- 摒弃二叉树结构,采用多叉树
这样就引出了一个新的查找树结构:多路查找树
B树
示例:三阶B树
特点
- 树的节点都包含元素信息
B+树
B+树是B树的变种,有着比B树更高的效率。
示例:3阶B+树
特点
- 元素不保存数据,只用来索引,所有数据都保存在叶子结点;(意味着同样大小的磁盘页可以容纳更多节点元素,使树更加矮胖,IO操作更少)
- 叶子结点包含了全部元素信息,且本身依赖关键字大小,自小而大顺序链接;
- 所有的中间节点都存在于叶子节点中;
B树卫星数据
B树节点数据存储在元素中,查找时只需要匹配到元素即可,最好情况是查询到跟节点,最坏情况是查询到叶子节点;
B+树卫星数据
B+树节点数据都存储在叶子节点中,每次查询都必须到叶子节点才能获取到数据;在范围查找方便B+树更有优势;
B树范围查找
[3-11]
B+树范围查找
[3-11]
B+树相比B树的优势
- 单一节点存储更多的元素,使得查询的IO次数更少;
- 所有查询都要查找到叶子节点,查询性能稳定;
- 所有叶子节点形成有序链表,便于范围查询;
使用
B树主要用于文件系统以及部分数据库索引,例如: MongoDB。而大部分关系数据库则使用B+树做索引,例如:mysql数据库;