AVL树、红黑树、B树、B+树

一、AVL树(平衡二叉搜索树)

AVL树是严格的平衡二叉搜索树,左右子树的高度差不超过1

不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡

由于旋转非常耗时,因此AVL树适合用于插入与删除次数比较少,查找次数多的情况。

二、红黑树

红黑树弱平衡二叉搜索树,红黑树确保没有一条路径会比其它路径长2倍(即从同一父节点出发到叶子节点,所有路径上的黑色节点数目是一样的)。

AVL树、红黑树、B树、B+树_第1张图片

性质:

  • 每个节点非黑即红
  • 如果一个节点是红的,那么它的俩儿子都是黑的
  • 根节点和叶子节点(叶节点即树尾端NULL指针或NULL节点)都是黑的;
  • 对于任意节点而言,其到叶子节点NULL指针的每条路径都包含相同数目的黑节点

三、红黑树与AVL树的区别

1.调整平衡机制不同

  • 红黑树通过颜色变更不超过三次的旋转来实现;
  • AVL树根据树的平衡因子旋转来实现;

2.红黑树的插入删除效率更高

  • 红黑树是用非严格的平衡来换取增删节点时候的旋转次数降低,任何平衡都会在三次旋转之内解决。红黑树只要求部分达到平衡。
  • AVL树是严格平衡二叉树,因此在增删节点调整平衡时,旋转次数比红黑树要多

3.AVL树的查找效率高

因为AVL树是严格平衡二叉树,所以AVL树节点的深度比红黑树的节点深度小,所以查找效率高。

实际应用中,查询的次数远远大于插入和删除,选择AVL树。如果查询和插入删除次数几乎差不多,应选择红黑树。不查找或查找次数很少,选择红黑树。

四、B树

B树是一种多叉路平衡搜索树,相对二叉树,B树每个节点有多个分支,即多叉。

以一颗度为5阶的B树为例,那这个B树每个节点最多存储4key5个指针AVL树、红黑树、B树、B+树_第2张图片

AVL树、红黑树、B树、B+树_第3张图片

特点: 

  • 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
  • 所有键值分布在整颗树中(索引值和具体data都在每个节点里);
  • 任何一个关键字出现且只出现在一个结点中
  • 在B树中,非叶子节点和叶子节点都会存放数据

五、B+树

B+树是B树的变种B+TreeB Tree的变种,我们以一颗最大度数为4(4阶)的b+tree为例,来看一下其结构示意图:AVL树、红黑树、B树、B+树_第4张图片

  • 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
  • 红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。

最终我们看到,B+Tree 与B Tree相比,主要有以下三点区别

  • 所有的数据都会出现在叶子节点
  • 叶子节点形成一个单向链表
  • 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。
MySQL索引数据结构 对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,形成带有顺序指针的B+Tree,提高区间访问的性能,利于排序 AVL树、红黑树、B树、B+树_第5张图片

题目扩充:

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的时间复杂度采用获得目标数据。

你可能感兴趣的:(C++,STL,b树,数据结构,链表)