BST、AVL、B-TREE、B+TREE、红黑树

1:BST 二叉搜索树(左子树值<=根值<=右子树)

1.1 定义

1 首先它也是一个二叉树,故满足递归定义;

2 其次每个节点只存在一个值;

3 需满足左子树值<=根值<=右子树,BST的中序遍历必定是严格递增的。

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

在实际场景中,用的最多的是二叉平衡树,

一般操作的执行时间福再度为O(lgn)。2.但若是一棵具有n个结点的线性链,则此些操作最坏情况运行时间为O(n)。

1.2   BST的搜索

       从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;

二叉树在搜索上的优势(和数组)

       数组的搜索比较方便,可以直接使用下标,数组如果不用二分查找,时间复杂度On),但删除或者插入就比较麻烦了,而链表与之相反,删除和插入都比较简单,但是查找很慢,这自然也与这两种数据结构的存储方式有关,数组是取一段相连的空间,而链表是每创建一个节点便取一个节点所需的空间,只是使用指针进行连接,空间上并不是连续的。而二叉树就既有链表的好处,又有数组的优点。

BST和二分查找

如果二叉查找树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么二叉查找树的搜索性能逼近二分查找O(logN),但它比连续内存空间的二分查找的优点是,改变二叉查找树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;连续内存空间(数组)

1.3   插入删除

BST涉及操作主要增,删,查,除了删麻烦一点,其他操作均可递归实现

2     AVL平衡二叉搜索树

定义:平衡二叉树或为空树,或为如下性质的二叉排序树:

  (1)左右子树深度之差的绝对值不超过1;

  (2)左右子树仍然为平衡二叉树.

3     B-树(B树、平衡多路):

B-tree是一种平衡多路搜索树(并不一定是二叉的)B-tree树即B树,如人们可能会以为B-树是一种树,是不对的

B树,一般用于外存储索引结构。系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的。二叉树、红黑树 [复杂度O(h)]导致树高度非常高(平衡二叉树一个节点只能有左子树和右子树),逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,IO次数多查找慢,效率低。

特点:

(1)根节点的左子树和右子树的深度最多相差1.(确保了不会出现上图右边的极端现象)

(2)是一个平衡多路搜索树,单个节点能放多个子节点

(3)所有结点都有存储关键字(数据);

(4)不太稳定,可能走不到叶子节点

3.1   搜索过程

B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点。

搜索性能等价于在关键字全集内做一次二分查找;

3.2   应用

       在数据索引上,系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。每个磁盘块作为一个节点

BST、AVL、B-TREE、B+TREE、红黑树_第2张图片

每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为17和35,P1指针指向的子树的数据范围为小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子树的数据范围为大于35。

模拟查找关键字29的过程:

  1. 根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】
  2. 比较关键字29在区间(17,35),找到磁盘块1的指针P2。
  3. 根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】
  4. 比较关键字29在区间(26,30),找到磁盘块3的指针P2。
  5. 根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】
  6. 在磁盘块8中的关键字列表中找到关键字29。

分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。

B树的大部分操作所需的磁盘存取次数和B树的高度成正比

4     B+TREE

B+树是B-树的变体,也是一种平衡多路搜索树,非叶子节点只做索引,所有数据都保存在叶子节点中。

和B树区别

1:根节点和分支节点中不保存数据,只用于索引  。数据和索引分离

2:所有数据都保存在叶子节点中

B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+Tree内节点去掉了data域,只做索引,减少了io次数,因此可以拥有更大的出度,拥有更好的性能。只利用索引快速定位数据索引范围,先定位索引再通过索引高效快速定位数据。

5     红黑树

5.1   什么是红黑树,六大特征

本质上是一个平衡搜索二叉树,和Btree不一样,可以说是AVL树的变种,牺牲了一定查询效率,减少了维护平衡的时间。log(n) 中序排序都能得到递增序列。

1)每个结点要么是红的,要么是黑的。(没有其他颜色)

2)根结点是黑的。

3)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。(叶子节点即为树尾端的NIL指针,或者说NULL节点。)

4)如果一个结点是红的,那么它的俩个儿子都是黑的。(父子节点不能是红色的

5)对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点。(最长路径是最小路径的2倍)

6)最多三次旋转,可以达到平衡

5.2   删除新增怎么达到平衡

旋转:通过左旋 右旋 变化颜色来达到平衡。

答:一切的操作都是为了保持那红黑树五条性质。,现在推导不出来,需要一定时间

5.3   红黑树相比于BST和AVL树有什么优点? 

        红黑树是牺牲了严格的高度平衡的优越条件为代价,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。

       相比于BST,因为红黑树可以能确保树的最长路径不大于两倍的最短路径的长度,所以可以看出它的查找效果是有最低保证的。在最坏的情况下也可以保证O(logN)的,这是要好于二叉查找树的。因为二叉查找树最坏情况可以让查找达到O(N)。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高,所以在插入和删除中所做的后期维护操作肯定会比红黑树要耗时好多

     但是他们的查找效率都是O(logN),所以红黑树应用还是高于AVL树的. 实际上插入 AVL 树和红黑树的速度取决于你所插入的数据.如果你的数据分布较好,则比较宜于采用 AVL树(例如随机产生系列数),但是如果你想处理比较杂乱的情况,则红黑树是比较快的。

你可能感兴趣的:(数据结构-算法)