精华内容
下载资源
问答
  • 红黑树优点

    2017-06-08 11:22:29
    红黑树是一种很有意思的平衡检索树。它的统计性能要好于平衡二叉树(有些书籍根据作者姓名,Adelson-Velskii和Landis,将其称为AVL-树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, ...
    1. 红黑树是一种很有意思的平衡检索树。它的统计性能要好于平衡二叉树(有些书籍根据作者姓名,Adelson-Velskii和Landis,将其称为AVL-树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。  
    2.   
    3. 红黑树的定义如下:  
    4.   
    5.   
    6. 满足下列条件的二叉搜索树是红黑树  
    7.   
    8.     * 每个结点要么是“红色”,要么是“黑色”(后面将说明)  
    9.     * 所有的叶结点都是空结点,并且是“黑色”的  
    10.     * 如果一个结点是“红色”的,那么它的两个子结点都是“黑色”的  
    11.     * (注:也就是說,如果結點是黑色的,那么它的子節點可以是紅色或者是黑色的)。  
    12.     * 结点到其子孙结点的每条简单路径都包含相同数目的“黑色”结点  
    13.     * 根结点永远是“黑色”的  
    14.   
    15. 之所以称为红黑树的原因就在于它的每个结点都被“着色”为红色或黑色。这些结点颜色被用来检测树的平衡性。但需要注意的是,红黑树并不是平衡二叉树,恰恰相反,红黑树放松了平衡二叉树的某些要求,由于一定限度的“不平衡”,红黑树的性能得到了提升。  
    16.   
    17. 从根结点到叶结点的黑色结点数被称为树的“黑色高度”(black-height)。前面关于红黑树的性质保证了从根结点到叶结点的路径长度不会超过任何其他路径的两倍。  
    18.   
    19. 我们来解释一下这个结论。考虑一棵黑色高度为3的红黑树:从根结点到叶结点的最短路径长度显然是2(黑-黑-黑),最长路径为4(黑-红-黑-红- 黑)。由于性质4,不可能在最长路经中加入更多的黑色结点,此外根据性质3,红色结点的子结点必须是黑色的,因此在同一简单路径中不允许有两个连续的红色结点。综上,我们能够建立的最长路经将是一个红黑交替的路径。  
    20.   
    21. 由此我们可以得出结论:对于给定的黑色高度为n的红黑树,从根到叶结点的简单路径的最短长度为n-1,最大长度为2(n-1)。  
    22.   
    23. 插入和删除操作中,结点可能被旋转以保持树的平衡。红黑树的平均和最差搜索时间都是O(log2 n)。Cormen [2001]给出了对于这一结论的证明。在实际应用中,红黑树的统计性能要好于平衡二叉树,但极端性能略差。  
    24.   
    25. 红黑树中结点的插入过程  
    26.   
    27. 插入结点的过程是:  
    28.   
    29.   
    30.     * 在树中搜索插入点  
    31.     * 新结点将替代某个已经存在的空结点,并且将拥有两个作为子结点的空结点  
    32.     * 新结点标记为红色,其父结点的颜色根据红黑树的定义确定;如果需要,对树作调整  
    33.   
    34. 注意 空结点和NULL指针是不同的。在简单的实现中,可以使用作为“监视哨”,标记为黑色的公共结点作为前面提到的空结点。  
    35.   
    36. 给一个红色结点加入两个空的子结点符合性质4,同时,也必须确保红色结点的两个子结点都是黑色的(根据性质3)。尽管如此,当新结点的父结点时红色时,插入红色的子结点将是违反定义的。这时存在两种情况。  
    37.   
    38. 红色父结点的兄弟结点也是红色的  
    39.   
    40. 例如下面的情况(X是希望插入的结点,  
    41.   
    42. 简单地对上级结点重新着色将解决冲突。当结点B被重新着色之后,应该重新检验更大范围内树结点的颜色,以确保整棵树符合定义的要求。结束时根结点应当是黑色的,如果它原先是红色的,则红黑树树的黑色高度将递增1。  
    43.   
    44. 红色父结点的兄弟结点是黑色的  
    45.   
    46. 这种情形比较复杂,如下图:  
    47.   
    48. 重新对结点着色将把结点A变成黑色,于是,树的平衡将被破坏,因为左子树的黑色高度将增加,而右子树的黑色高度没有相应地改变。如果我们把结点B着上红色,那么左右子树的高度都将减少,树依然不平衡。此时,继续对结点C进行着色将导致更糟糕的情况,左子树黑色高度增加,右子树黑色高度减少。为了解决问题,需要旋转并对树结点进行重新着色。这时算法将正常结束,因为子树的根结点(A)被着色为黑色,同时,不会引入新的红-红冲突。  
    49.   
    50. 结束插入过程  
    51.   
    52. 插入结点时,可能会需要重新着色,或者旋转,来保持红黑树的性质。如果旋转完成,那么算法就结束了。对于重新着色来说,我们会在子树的根留下一个红色结点,于是需要继续向上对树进行修整,以保持红黑树的性质。最坏情况下,我们将不得不对到树根的所有路径进行处理。插入的时间复杂度为O(log2 n)。删除结点的时间复杂度与此类似。  
    53.   
    54. 结点的删除  
    55.   
    56. 红黑树的结点删除情况要比插入复杂一些。我们可以把实际的删除操作分成3种情况(先不讨论颜色),其中被删除的结点用紫色标记,蓝色表示任意颜色的结点,可能是红色,也可能是黑色:  
    57.   
    58. 情况a: 被删除的结点没有子结点(两个子结点都是空结点)  
    59.   
    60. 原先属于X的空结点被A“继承”。如果被删除结点是黑色结点,则可能造成树的黑色高度变化。  
    61.   
    62. 情况b: 有一个子结点  
    63.   
    64. B结点取代原X结点的位置。如果被删除的结点是黑色结点,则可能造成树的黑色高度发生变化;如果B是红色结点,还可能需要重新着色。  
    65.   
    66. 情况c: 有两个子结点  
    67.   
    68. 这种情形比较复杂。需要将X和它的左子树中的键值最大的结点进行交换。这通常会导致重新着色,对树的黑色高度的改变,以及随之而来的旋转。  
    69.   
    70. 需要说明的是,仅仅删除结点是不够的,因为此后很可能还需要对树进行重新着色。如果删除的是红色结点,那么没有关系,因为这不会影响树的黑色高度;而如果删除的是黑色结点,事情就没那么简单了。需要把受到影响(移动或交换)的结点标记为黑色,如果它原来已经是黑色的,那么需要标记为“双黑”(双黑,或double-black是许多英文资料中提及的一个概念。简单地说,标记为“双黑”意味着需要对周围的红色结点进行“抹黑 ”处理)。  
    71.   
    72. 包含“双黑”结点显然不符合红黑树的要求,因此必须消除这种情况。出现“双黑”的情况可以分为4种:  
    73.   
    74. 1、双黑结点的兄弟结点是红色的  
    75.   
    76. 2、双黑结点的兄弟是黑色的,并且它的兄弟有两个黑色的子结点  
    77.   
    78. 3、双黑结点的兄弟是黑色的,并且,它的兄弟的左、右子结点分别是红色和黑色  
    79.   
    80. 4、双黑结点的兄弟是黑色的,并且,它的兄弟的右子结点是红色的  
    81.   
    82. 很显然,上述四种情况包括了可能的所有状况。  
    83.   
    84. 处理双黑结点的基本思想是进行“色彩补偿”。换言之,将邻近的红色结点变为黑色,同时,此双黑结点也“还原”为黑色。  
    85.   
    86. 总结  
    87.   
    88. 红黑树引入了“颜色”的概念。引入“颜色”的目的在于使得红黑树的平衡条件得以简化。正如著名的密码学专家Bruce Schneier所说的那样,“Being Partly balanced can be good enough”,红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。  
    89.   
    90. 红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。  
    91.   
    92. 当然,红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。  
    93.   
    94. 在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。 
    展开全文
  • 二叉树 红黑树 B树 B+树的优缺点

    千次阅读 2021-04-09 09:47:58
    本文将从最普通的二叉查找开始,逐步说明各种解决的问题以及面临的新问题,从而说明MySQL为什么选择B+作为索引结构。 一、二叉查找(BST):不平衡 二叉查找(BST,Binary Search Tree),也叫二叉排序,...

    前言

    在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B+树作为索引结构。

    一、二叉查找树(BST):不平衡

    二叉查找树(BST,Binary Search Tree),也叫二叉排序树,在二叉树的基础上需要满足:任意节点的左子树上所有节点值不大于根节点的值,任意节点的右子树上所有节点值不小于根节点的值。如下是一颗BST(图片来源)。

     

     

    当需要快速查找时,将数据存储在BST是一种常见的选择,因为此时查询时间取决于树高,平均时间复杂度是O(lgn)。然而,BST可能长歪而变得不平衡,如下图所示(图片来源),此时BST退化为链表,时间复杂度退化为O(n)。

    为了解决这个问题,引入了平衡二叉树。

     

     

    二、平衡二叉树(AVL):旋转耗时

    AVL树是严格的平衡二叉树,所有节点的左右子树高度差不能超过1;AVL树查找、插入和删除在平均和最坏情况下都是O(lgn)。

    AVL实现平衡的关键在于旋转操作:插入和删除可能破坏二叉树的平衡,此时需要通过一次或多次树旋转来重新平衡这个树。当插入数据时,最多只需要1次旋转(单旋转或双旋转);但是当删除数据时,会导致树失衡,AVL需要维护从被删除节点到根节点这条路径上所有节点的平衡,旋转的量级为O(lgn)。

    由于旋转的耗时,AVL树在删除数据时效率很低;在删除操作较多时,维护平衡所需的代价可能高于其带来的好处,因此AVL实际使用并不广泛。

    三、红黑树:树太高

    与AVL树相比,红黑树并不追求严格的平衡,而是大致的平衡:只是确保从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。从实现来看,红黑树最大的特点是每个节点都属于两种颜色(红色或黑色)之一,且节点颜色的划分需要满足特定的规则(具体规则略)。红黑树示例如下(图片来源):

     

     

    与AVL树相比,红黑树的查询效率会有所下降,这是因为树的平衡性变差,高度更高。但红黑树的删除效率大大提高了,因为红黑树同时引入了颜色,当插入或删除数据时,只需要进行O(1)次数的旋转以及变色就能保证基本的平衡,不需要像AVL树进行O(lgn)次数的旋转。总的来说,红黑树的统计性能高于AVL。

    因此,在实际应用中,AVL树的使用相对较少,而红黑树的使用非常广泛。例如,Java中的TreeMap使用红黑树存储排序键值对;Java8中的HashMap使用链表+红黑树解决哈希冲突问题(当冲突节点较少时,使用链表,当冲突节点较多时,使用红黑树)。

    对于数据在内存中的情况(如上述的TreeMap和HashMap),红黑树的表现是非常优异的。但是对于数据在磁盘等辅助存储设备中的情况(如MySQL等数据库),红黑树并不擅长,因为红黑树长得还是太高了。当数据在磁盘中时,磁盘IO会成为最大的性能瓶颈,设计的目标应该是尽量减少IO次数;而树的高度越高,增删改查所需要的IO次数也越多,会严重影响性能。

    四、B树:为磁盘而生

    B树也称B-树(其中-不是减号),是为磁盘等辅存设备设计的多路平衡查找树,与二叉树相比,B树的每个非叶节点可以有多个子树。因此,当总节点数量相同时,B树的高度远远小于AVL树和红黑树(B树是一颗“矮胖子”),磁盘IO次数大大减少。

    定义B树最重要的概念是阶数(Order),对于一颗m阶B树,需要满足以下条件:

    • 每个节点最多包含 m 个子节点。
    • 如果根节点包含子节点,则至少包含 2 个子节点;除根节点外,每个非叶节点至少包含 m/2 个子节点。
    • 拥有 k 个子节点的非叶节点将包含 k - 1 条记录。
    • 所有叶节点都在同一层中。

    可以看出,B树的定义,主要是对非叶结点的子节点数量和记录数量的限制。

    下图是一个3阶B树的例子(图片来源):

     

     

    B树的优势除了树高小,还有对访问局部性原理的利用。所谓局部性原理,是指当一个数据被使用时,其附近的数据有较大概率在短时间内被使用。B树将键相近的数据存储在同一个节点,当访问其中某个数据时,数据库会将该整个节点读到缓存中;当它临近的数据紧接着被访问时,可以直接在缓存中读取,无需进行磁盘IO;换句话说,B树的缓存命中率更高。

    B树在数据库中有一些应用,如mongodb的索引使用了B树结构。但是在很多数据库应用中,使用了是B树的变种B+树。

    五、B+树

    B+树也是多路平衡查找树,其与B树的区别主要在于:

    • B树中每个节点(包括叶节点和非叶节点)都存储真实的数据,B+树中只有叶子节点存储真实的数据,非叶节点只存储键。在MySQL中,这里所说的真实数据,可能是行的全部数据(如Innodb的聚簇索引),也可能只是行的主键(如Innodb的辅助索引),或者是行所在的地址(如MyIsam的非聚簇索引)。
    • B树中一条记录只会出现一次,不会重复出现,而B+树的键则可能重复重现——一定会在叶节点出现,也可能在非叶节点重复出现。
    • B+树的叶节点之间通过双向链表链接。
    • B树中的非叶节点,记录数比子节点个数少1;而B+树中记录数与子节点个数相同。

    由此,B+树与B树相比,有以下优势:

    • 更少的IO次数:B+树的非叶节点只包含键,而不包含真实数据,因此每个节点存储的记录个数比B数多很多(即阶m更大),因此B+树的高度更低,访问时所需要的IO次数更少。此外,由于每个节点存储的记录数更多,所以对访问局部性原理的利用更好,缓存命中率更高。
    • 更适于范围查询:在B树中进行范围查询时,首先找到要查找的下限,然后对B树进行中序遍历,直到找到查找的上限;而B+树的范围查询,只需要对链表进行遍历即可。
    • 更稳定的查询效率:B树的查询时间复杂度在1到树高之间(分别对应记录在根节点和叶节点),而B+树的查询复杂度则稳定为树高,因为所有数据都在叶节点。

    B+树也存在劣势:由于键会重复出现,因此会占用更多的空间。但是与带来的性能优势相比,空间劣势往往可以接受,因此B+树的在数据库中的使用比B树更加广泛。

    六、B+树的魅力

    前面说到,B树/B+树与红黑树等二叉树相比,最大的优势在于树高更小。实际上,对于Innodb的B+索引来说,树的高度一般在2-4层。下面来进行一些具体的估算。

    树的高度是由阶数决定的,阶数越大树越矮;而阶数的大小又取决于每个节点可以存储多少条记录。Innodb中每个节点使用一个页(page),页的大小为16KB,其中元数据只占大约128字节左右(包括文件管理头信息、页面头信息等等),大多数空间都用来存储数据。

    • 对于非叶节点,记录只包含索引的键和指向下一层节点的指针。假设每个非叶节点页面存储1000条记录,则每条记录大约占用16字节;当索引是整型或较短的字符串时,这个假设是合理的。延伸一下,我们经常听到建议说索引列长度不应过大,原因就在这里:索引列太长,每个节点包含的记录数太少,会导致树太高,索引的效果会大打折扣,而且索引还会浪费更多的空间。
    • 对于叶节点,记录包含了索引的键和值(值可能是行的主键、一行完整数据等,具体见前文),数据量更大。这里假设每个叶节点页面存储100条记录(实际上,当索引为聚簇索引时,这个数字可能不足100;当索引为辅助索引时,这个数字可能远大于100;可以根据实际情况进行估算)。

    对于一颗3层B+树,第一层(根节点)有1个页面,可以存储1000条记录;第二层有1000个页面,可以存储1000*1000条记录;第三层(叶节点)有1000*1000个页面,每个页面可以存储100条记录,因此可以存储1000*1000*100条记录,即1亿条。而对于二叉树,存储1亿条记录则需要26层左右。

    七、总结

    展开全文
  • 红黑树与AVL树,各自的优缺点总结

    千次阅读 2020-02-19 11:56:08
    特意转载来方便学习 RB-Tree和AVL树作为BBST,其实现的算法时间复杂度相同,AVL作为最先提出的BBST,貌似RB-tree实现的功能都可以用...红黑树不追求"完全平衡",即不像AVL那样要求节点的 |balFact| <= 1,它只要...

    本文内容来自链接:https://www.jianshu.com/p/37436ed14cc6
    特意转载来方便学习

    RB-Tree和AVL树作为BBST,其实现的算法时间复杂度相同,AVL作为最先提出的BBST,貌似RB-tree实现的功能都可以用AVL树是代替,那么为什么还需要引入RB-Tree呢?

    红黑树不追求"完全平衡",即不像AVL那样要求节点的 |balFact| <= 1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。
    就插入节点导致树失衡的情况,AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1)
    删除节点导致失衡,AVL需要维护从被删除节点到根节点root这条路径上所有节点的平衡,旋转的量级为O(logN),而RB-Tree最多只需要旋转3次实现复衡,只需O(1),所以说RB-Tree删除节点的rebalance的效率更高,开销更小!
    AVL的结构相较于RB-Tree更为平衡,插入和删除引起失衡,如2所述,RB-Tree复衡效率更高;当然,由于AVL高度平衡,因此AVL的Search效率更高啦。
    针对插入和删除节点导致失衡后的rebalance操作,红黑树能够提供一个比较"便宜"的解决方案,降低开销,是对search,insert ,以及delete效率的折衷,总体来说,RB-Tree的统计性能高于AVL.
    故引入RB-Tree是功能、性能、空间开销的折中结果。
    5.1 AVL更平衡,结构上更加直观,时间效能针对读取而言更高;维护稍慢,空间开销较大。
    5.2 红黑树,读取略逊于AVL,维护强于AVL,空间开销与AVL类似,内容极多时略优于AVL,维护优于AVL。
    基本上主要的几种平衡树看来,红黑树有着良好的稳定性和完整的功能,性能表现也很不错,综合实力强,在诸如STL的场景中需要稳定表现。
    红黑树的查询性能略微逊色于AVL树,因为其比AVL树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的AVL树最多多一次比较,但是,红黑树在插入和删除上优于AVL树,AVL树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于AVL树为了维持平衡的开销要小得多

    总结:实际应用中,若搜索的次数远远大于插入和删除,那么选择AVL,如果搜索,插入删除次数几乎差不多,应该选择RB。

    展开全文
  • 1、二叉查找缺点 二叉查找,相信大家都接触过,二叉查找的特点就是左子树的节点值比父亲节点小,而右子的节点值比父亲节点大,如图 基于二叉查找的这种特点,我们在查找某个节点的时候,可以采取类似于...

    1、二叉查找树的缺点
    二叉查找树,相信大家都接触过,二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图
    Alt
    基于二叉查找树的这种特点,我们在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点。n 个节点的二叉查找树,正常的情况下,查找的时间复杂度为 O(logn)。

    之所以说是正常情况下,是因为二叉查找树有可能出现一种极端的情况,例如
    Alt
    这种情况也是满足二叉查找树的条件,然而,此时的二叉查找树已经近似退化为一条链表,这样的二叉查找树的查找时间复杂度顿时变成了 O(n),可想而知,我们必须不能让这种情况发生,为了解决这个问题,于是我们引申出了平衡二叉树。

    2、平衡二叉树
    平衡二叉树就是为了解决二叉查找树退化成一颗链表而诞生了,平衡树具有如下特点

    1、具有二叉查找树的全部特性。

    2、每个节点的左子树和右子树的高度差至多等于1。

    例如:图一就是一颗平衡树了,而图二则不是(节点右边标的是这个节点的高度)
    Alt
    Alt

    对于图二,因为节点9的左孩子高度为2,而右孩子高度为0。他们之间的差值超过1了。

    平衡树基于这种特点就可以保证不会出现大量节点偏向于一边的情况了。关于平衡树如何构建、插入、删除、左旋、右旋等操作这里不在说明.

    于是,通过平衡树,我们解决了二叉查找树的缺点。对于有 n 个节点的平衡树,最坏的查找时间复杂度也为 O(logn)。

    3、为什么有了平衡树还需要红黑树?
    虽然平衡树解决了二叉查找树退化为近似链表的缺点,能够把查找时间控制在 O(logn),不过却不是最佳的,因为平衡树要求每个节点的左子树和右子树的高度差至多等于1,这个要求实在是太严了,导致每次进行插入/删除节点的时候,几乎都会破坏平衡树的第二个规则,进而我们都需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。

    显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树,红黑树具有如下特点:
    1、红黑树的特性
    (1)每个节点或者是黑色,或者是红色。
    (2)根节点是黑色。
    (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
    (4)如果一个节点是红色的,则它的子节点必须是黑色的。
    (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。[这里指到叶子节点的路径]
    包含n个内部节点的红黑树的高度是 O(log(n)).
    如图:

    Alt

    2、红黑树的使用场景
    java中使用到红黑树的有TreeSet和JDK1.8的HashMap。

    但是问题来了,为什么要使用红黑树,红黑树的插入和删除都要满足以上5个特性,而作非常复杂的操作。
    原因:
    红黑树是一种平衡树,他复杂的定义和规则都是为了保证树的平衡性。如果树不保证他的平衡性就是下图:很显然这就变成一个链表了。
    Alt
    保证平衡性的最大的目的就是降低树的高度,因为树的查找性能取决于树的高度。所以树的高度越低搜索的效率越高!
    这也是为什么存在二叉树、搜索二叉树等,各类树的目的。

    二、B树
    1、B树的特性
    一棵m阶的B树的满足条件:
    (1)每个节点至多有m棵子树
    (2)根节点除外,其它每个分支节点至少有【m/2】棵子树
    (3)根节点至少有两棵子树(除非B树只包含一个节点)
    (4)所有叶子节点在同一层上,B树的叶子节点可以看成一种外部节点,不包含任何信息。
    (5)有j个孩子的非叶结点恰好有j-1个关键码,关键码按递增次序排列。
    B 树又叫平衡多路查找树。如图:
    Alt

    2、B树的使用场景
    B树多用于做文件系统的索引。

    那么问题来了:为什么要用B树,红黑树不是就挺好的么?
    原因:
    B树和二叉树、红黑树相比较,子树更多也就是路数越多,子树月多表示数的高度越低,搜索效率越高,当然如果路数太多就可能变成一个有序数组了(如下图)。所以当然不可能使得路数无限大。
    Alt

    回到正题:正因为文件系统和数据库一般都是存在电脑硬盘上的,如果数据量太大的话不一定能一次性加载到内存中。(一棵树不能一次性加载完怎么查找对吧?)但是B树可以多路存储。也正因为B树的这一个优点,可以在文件查找的时候每次只加载一个节点的内容存入内存来查找。而红黑树在内存中查找非常块,但是如果在数据库和文件系统中,显然B树更优。

    三、B+树
    B+树是B树的变种,有着比B树更高的查询效率。
    1、B+树的特性
    (1)有 k 个子树的中间节点包含有 k 个元素(B 树中是 k-1 个元素),每个元素不保存数据,只用来索引,所有数据
    都保存在叶子节点。
    (2)所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小
    自小而大顺序链接。
    (3)所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
    Alt

    2、B+树的使用场景
    B+树是在B树的基础上进行改造的,他的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。
    B+树多用于数据库中的索引。

    那么为什么B+树用于数据库中的索引呢?
    原因:
    因为在数据库中select常常不只是查询一条记录,常常要查询多条记录。比如:按照id的排序的后10条。如果是多条的话,B树需要做中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能够把所有数据取出来了。

    B*树:
    是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;

    Alt
    B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3
    (代替B+树的1/2);

    B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据

    复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父

    结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

    B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分

    数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字

    (因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之

    间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

    所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

    小结:
    B-树:
    多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键

    字范围的子结点;

    所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

    B+树:
    在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点

    中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

    B*树:
    在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率

    从1/2提高到2/3;

    参考链接:https://blog.csdn.net/wyqwilliam/article/details/82935922
    参考链接:https://blog.csdn.net/dreamispossible/article/details/92852943
    参考链接:https://blog.csdn.net/zgz15515397650/article/details/85165454

    展开全文
  • 红黑树优点

    千次阅读 2015-09-21 11:27:18
    红黑树是一种很有意思的平衡检索树。它的统计性能要好于平衡二叉树(有些书籍根据作者姓名,Adelson-Velskii和Landis,将其称为AVL-树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, ...
  • 1、二叉查找(Binary Search Tree) 很显然,二叉查找的发现完全是因为静态查找结构在动态插入,删除结点所表现出来的无能为力(需要付出极大的代价)。 BST的操作代价分析: (1) 查找代价: 任何一个数据的查找...
  • 哈希表与红黑树的特点及区别

    千次阅读 2018-09-27 22:36:00
    红黑树占用的内存更小(仅需要为其存在的节点分配内存),而Hash事先就应该分配足够的内存存储散列表(即使有些槽可能遭弃用)。 红黑树查找和删除的时间复杂度都是O(logn),Hash查找和删除的时间复杂度都是O(1)...
  • HashMap原理讲解(一) - 红黑树

    千次阅读 2017-12-22 11:47:58
    一. 二叉树概述二叉树是递归定义的,其节点有左右子树之分1.1 二叉树特性: 每个节点最多只有两颗子树,节点的度最大为2 左子树和右子是有顺序的,次序不能颠倒 ... 二叉查找BST二叉查找 - BST:Binary Searc
  • 优点红黑树查找方便,时间复杂度是树的高度。 红黑树的基本原理,大家应该都知道,我这里再写一遍: 树上的每个节点不是黑色就是红色 根节点是黑色 叶子节点是黑的 一个红色节点他的两个子节点都是黑的 任意一个...
  • 红黑树与跳表

    2020-04-12 09:46:13
    先分析一波红黑树吧。。 根节点到任意一个叶子节点所经过的节点数量是相同的 每个节点或者是红色,或者是黑色(定义) 根节点一定是黑色的(对应2-3树的2节点和3节点) 空节点是黑色的 如果一个节点是红色的,...
  • 二叉树,二叉查找树,平衡二叉树以及红黑树概述

    千次阅读 多人点赞 2019-07-05 21:17:39
    在这篇博客之前,花了些时间了解红黑树的内容,但是没有形成自己的知识图谱,也没有一条清晰的逻辑主线将知识串联起来,这次重新整理了一下。 首先,这里过滤了树模型的一些基础概念上的内容,比如父节点,子节点,...
  • 为什么要使用红黑树,B树和B+树

    千次阅读 多人点赞 2018-12-21 17:22:18
    一、红黑树 1、红黑树的特性 (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!] (4)如果一个节点是红色的,...
  • 二叉搜索的一个缺点是不平衡,当插入的数是随机数时效果很好,当插入的是有序的数时就和链表一样了,没有了插入和查询都块的特点了,这里介绍一种改进保证了二叉搜索的平衡,当插入的是顺序也好随机也好都能保证...
  • 文章目录前引推荐数据结构可视化网址推荐讲解红黑树的博客与视频红黑树介绍1、接触红黑树的原因2、二叉搜索树的介绍1、二叉搜索树BST(不自平衡)2、AVL树(完美自平衡二叉搜索树)3、红黑树(综合性能强劲 不平凡的...
  • 注意:本文不涉及红黑树的具体实现,并且默认读者已经对二叉树,二叉查找树,AVL树等已经了解并熟悉。 一、平衡二叉查找树 定义:树中任意一个节点的左右子树高度差不大于1。 AVL树是一种严格按照定义来实现的...
  • 红黑树(RB-tree)比AVL树的优势在哪?

    万次阅读 多人点赞 2016-06-16 17:03:24
    今天看了STL源码剖析中关于红黑树的原理和实现,看完复杂的节点插入、节点颜色变换后不禁想:这些功能经典的AVL树也能实现,为什么要提出红黑树?查了些资料,并且加上自己理解,感叹红黑树的巧妙。 首先红黑树是不...
  • java数据结构B树 B+树 红黑树详解

    千次阅读 2019-10-17 16:41:21
    B树 B+树 红黑树详解 常见的查找算法 B树 查找 插入 没有破坏结构 结构破坏 分裂 删除 终端 1 直接删除 2兄弟够借 3兄弟不够借 非终端 1 2 ...
  • 红黑树详解以及与BST和AVL树的比较

    千次阅读 2017-10-17 21:04:21
    1.stl中的set底层用的什么数据结构? 红黑树 2.红黑树的数据结构怎么定义? [cpp] view plain copy     enum Color  {   
  • HashMap中的红黑树

    2018-02-13 20:21:04
    http://blog.csdn.net/u011240877/article/details/53358305 张拭心读完本文你将了解到:点击查看 Java 集合框架深入理解 系列 - - 乾杯传统 HashMap 的缺点HashMap 在 JDK 18 中新增的数据结构 红黑树HashMap 中...
  • 很显然,二叉查找的发现完全是因为静态查找结构在动态插入,删除结点所表现出来的无能为力(需要付出极大的代价)。 BST 的操作代价分析:  (1) 查找代价: 任何一个数据的查找
  • 上篇文章我们介绍了 HashMap 的主要特点和关键方法源码解读,这篇文章我们介绍 HashMap 在 JDK1.8 新增树形化相关的内容。 读完本文你将了解到: ...传统 HashMap 的缺点 HashMap 在 JDK 18 中新增的数据结构 红黑树
  • 算法导论 - 红黑树红黑树平衡的详细解析个人理解 红黑树一种数据结构,效率极高,插入和删除的操作的时间...数组特点是元素在内存中紧挨着存储,因而优点是定位快(O(1)),缺点是插入删除慢(O(n));而链表则不...
  • 二叉搜索 二叉查找/搜索/排序 BST (binary search/...优点:构建方便,查找快速 缺点:极端状况会退化成链表。 平衡二叉树 平衡二叉树(Self-balancing binary search tree) 自平衡二叉查找 又被称为AVL(有别
  • 红黑树硬核讲解

    2021-03-11 00:55:57
    因为申请较晚,本公众号没留言,想交流的欢迎添加私人微信,一起相互吹捧,共同进步。1 引言预防针:红黑树本来就是基本算法中的难点,所以看此文时建议先有点预备心理或知识铺垫,没接触过RBT而直...
  • 特性(除了具备二叉查找树的特性外,还具备如下特性): (1)节点是红色或者黑色 (2)根节点是黑色 (3)每个叶子节点(也叫终端节点,简称“叶子”)都是黑色的空节点(NIL...红黑树从根到叶子的最长路径不会超...
  • 转自点击打开链接查找(一) 我们使用符号表这个词来描述...我们会用三种经典的数据类型来实现高效的符号表:二叉查找数、红黑树、散列表。二分查找我们使用有序数组存储键,经典的二分查找能够根据数组的索引大大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,283
精华内容 5,713
关键字:

红黑树的优点缺点