章节目录:
一、二叉树与B 树
1.1 二叉树问题
二叉树的操作效率较高,但是也存在问题。
- 示意图:
- 二叉树是需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如 1 亿),就会存在如下问题:
- 问题 1:在构建二叉树时,需要多次进行
I/O
操作(海量数据存在数据库或文件中),则海量节点的情况下,构建速度会受到影响。 - 问题 2:节点海量也会造成二叉树的高度很高,则会降低操作速度。
1.2 多叉树
多叉树通过重新组织节点,减少树的高度,能对二叉树进行优化。
- 在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(Multiway tree)。
- 举例说明:
2-3树
,2-3-4树
就是多叉树。 - 示意图:
1.3 B 树基本介绍
B树
通过重新组织节点,降低树的高度,并且减少I/O
读写次数来提升效率。
- 示意图:
- 文件系统及数据库系统的设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页(页得大小通常为 4k), 这样每个节点只需要一次
I/O
就可以完全载入。 - 假设将树的度 M 设置为 1024,在 600 亿个元素中最多只需要 4 次
I/O
操作就可以读取到想要的元素,B树
(B+树
)广泛应用于文件存储系统以及数据库系统中。
二、2-3 树
2-3树
是由二节点和三节点构成的树,同时它也是最简单的B树
结构。
2.1 特点介绍
2-3树
的所有叶子节点都在同一层 (只要是B树
都满足这个条件)。- 有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点。
- 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点。
2.2 应用实例
需求:将数列{16, 24, 12, 32, 14, 26, 34, 10, 8, 28, 38, 20} 构建成
2-3树
,并保证数据插入的大小顺序。
-
前提条件:
2-3树
的所有叶子节点都在同一层(只要是B树
都满足这个条件) ;- 有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点;
- 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点;
-
插入规则:当按照规则插入一个数到某个节点时,不能满足上面三个要求,就需要拆,先向上拆,如果上层满,则拆本层, 拆后仍然需要满足上面 3 个条件;
-
备注提示:对于三节点的子树的值大小仍然遵守(BST 二叉排序树)的规则。
-
数列拆解过程-示意图:
2.3 补充说明
- 除了
2-3树
,还有2-3-4树
等,概念和2-3树
类似,也是一种B树
。
三、B 树、B+树和 B*树
3.1 B 树介绍
B(Balanced)-Tree
树即B树
(也有翻译为B-
树)。
- 示意图:
-
说明:
- 阶:节点的最多子节点个数。比如
2-3树
的阶是 3,2-3-4树
的阶是 4。 - 搜索:从根节点开始,对节点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子节点;重复,直到所对应的儿子指针为空或已经是叶子节点。
- 关键字分布:集合分布在整颗树中(即叶子节点和非叶子节点都存放数据),搜索有可能在非叶子节点结束。
- 搜索性能:等价于在关键字全集内做一次二分查找。
- 阶:节点的最多子节点个数。比如
3.2 B+ 树介绍
B+树
是B树
的变体,也是一种多路搜索树。
- 示意图:
- 说明:
- 搜索:
B+树
的搜索与B树
也基本相同,区别是B+树
只有达到叶子节点才命中(B树
可以在非叶子节点命中)。 - 关键字分布:所有关键字都出现在叶子节点的链表中(即数据只能在叶子节点<也叫稠密索引>),且链表中的关键字(数据)恰好是有序的,搜索不可能在非叶子节点命中。
- 非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层。
- 场景:更适合文件索引系统。
- 搜索性能:也等价于在关键字全集做一次二分查找。
- 搜索:
- 额外补充:
MySQL
建索引可使用的数据结构有B+树
和Hash
两种,但是Hash
用得很少, 优点是可以快速定位到某一行,缺点是不能解决范围查询问题。对于如果不需要使用范围查询、只需要精准查询的场景,可以使用Hash
索引方法,比如查电话号码,但绝大多数情况下使用的是B+树
。 - 注意:
B树
和B+树
各有自己的应用场景,不能说B+树
完全比B树
好,反之亦然。
3.3 B* 树介绍
B*树
是B+树
的变体,在B+树
的非根和非叶子节点再增加指向兄弟的指针。- 示意图:
- 说明:
B*树
定义了非叶子节点关键字个数至少为(2/3)*M(M为树的度,即树内各结点最大的度),即块的最低使用率为 2/3,而B+树
的块的最低使用率为的1/2。- 从上述特点我们可以看出,
B*树
分配新节点的概率比B+树
要低,空间使用率更高。
四、结束语
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。