一、AVL树(平衡二叉搜索树)
AVL树是严格的平衡二叉搜索树,左右子树的高度差不超过1。
不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡。
由于旋转非常耗时,因此AVL树适合用于插入与删除次数比较少,查找次数多的情况。
二、红黑树
红黑树是弱平衡二叉搜索树,红黑树确保没有一条路径会比其它路径长2倍(即从同一父节点出发到叶子节点,所有路径上的黑色节点数目是一样的)。
性质:
- 每个节点非黑即红;
- 如果一个节点是红的,那么它的俩儿子都是黑的;
- 根节点和叶子节点(叶节点即树尾端NULL指针或NULL节点)都是黑的;
- 对于任意节点而言,其到叶子节点NULL指针的每条路径都包含相同数目的黑节点;
三、红黑树与AVL树的区别
1.调整平衡机制不同
- 红黑树通过颜色变更和不超过三次的旋转来实现;
- AVL树根据树的平衡因子和旋转来实现;
2.红黑树的插入删除效率更高
- 红黑树是用非严格的平衡来换取增删节点时候的旋转次数降低,任何平衡都会在三次旋转之内解决。红黑树只要求部分达到平衡。
- AVL树是严格平衡二叉树,因此在增删节点调整平衡时,旋转次数比红黑树要多。
3.AVL树的查找效率高
因为AVL树是严格平衡二叉树,所以AVL树节点的深度比红黑树的节点深度小,所以查找效率高。
实际应用中,查询的次数远远大于插入和删除,选择AVL树。如果查询和插入删除次数几乎差不多,应选择红黑树。不查找或查找次数很少,选择红黑树。
四、B树
B树是一种多叉路平衡搜索树,相对二叉树,B树每个节点有多个分支,即多叉。
以一颗度为5阶的B树为例,那这个B树每个节点最多存储4个key,5个指针:
特点:
- 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
- 所有键值分布在整颗树中(索引值和具体data都在每个节点里);
- 任何一个关键字出现且只出现在一个结点中;
- 在B树中,非叶子节点和叶子节点都会存放数据。
五、B+树
B+树是B树的变种,B+Tree是B Tree的变种,我们以一颗最大度数为4(4阶)的b+tree为例,来看一下其结构示意图:
- 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
- 红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。
最终我们看到,B+Tree 与B Tree相比,主要有以下三点区别:
- 所有的数据都会出现在叶子节点。
- 叶子节点形成一个单向链表。
- 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。
MySQL索引数据结构 对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,形成带有顺序指针的B+Tree,提高区间访问的性能,利于排序。
题目扩充:
1、B树用于索引的天然优势
B 树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般被用在文件系统及数据库中。
索引的效率依赖与磁盘 IO 的次数,快速索引需要有效的减少磁盘 IO 次数。在索引过程中由于索引相关信息都存储在磁盘上,沿着树的每次的查找都是一个IO索引,B树的每个节点中data包含多个元素,并且位于磁盘上的同一block。采用B树查找,可以在更少的IO索引次数内定位目标元素所在的磁盘block。效率比二叉平衡搜索树效率更高。
局部性原理与磁盘预读
由于存储介质的特性,磁盘本身存取就比主存慢很多,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。
2、MySQL索引为什么要用B+树,而不是B树?
因为B+树中,只有叶子节点才存储有实际的data,非叶子节点内不存储data,因此在磁盘的一个页中可以存储更多的节点,因此可以使得B+树的深度更小,在索引时能通过更少的IO索引次数定位目标元素的位置。
B树的非叶子节点同时存有key和data,因此索引时间不定,可能在根节点就获得目标数据。
B+树只有叶子节点才存有data,因此必须通过logn的时间复杂度采用获得目标数据。