在avl树的红色黑树

时间:2012-12-13 04:17:49

标签: algorithm data-structures red-black-tree

AVL和红黑树都是自平衡的,除了节点中的红色和黑色。选择红黑树而不是AVL树的主要原因是什么?红黑树有哪些应用?

7 个答案:

答案 0 :(得分:87)

  

选择红黑树而不是AVL树的主要原因是什么?

红黑树和AVL树是最常用的平衡二叉搜索树,它们支持保证O(logN) time中的插入,删除和查找。但是,两者之间有以下几点比较:

  • AVL树更加严格平衡,因此可以提供更快的查找效果。因此,对于查找密集型任务,请使用AVL树。
  • 对于插入密集型任务,请使用红黑树。
  • AVL树存储每个节点的平衡因子。这需要O(N) extra space。但是,如果我们知道将插入树中的键总是大于零,我们可以使用键的符号位来存储红黑树的颜色信息。因此,在这种情况下,红黑树需要O(1) extra space
  • 通常,AVL树的旋转比红黑树更难实现和调试。
  

红黑树的应用是什么?

红黑树更为通用。它们在添加,删除和查找方面表现相对较好,但AVL树的查找速度更快,代价是添加/删除速度较慢。红黑树用于以下内容:

  • Java:java.util.TreeMap,java.util.TreeSet
  • C ++ STL:map,multimap,multiset
  • Linux内核:完全公平的调度程序,linux / rbtree.h

答案 1 :(得分:8)

尝试阅读此article

它提供了一些关于差异,相似性,表现等的好的见解。

以下是文章的引用:

  

RB-Trees和AVL树一样,是自平衡的。它们都提供O(log n)查找和插入性能。

     

不同之处在于RB-Trees保证每次插入操作的O(1)旋转。这就是实际实现中实际成本的原因。

     

简化后,RB-Trees从概念上获得了2-3个树的优势,而没有携带动态节点结构的开销。物理RB-Trees实现为二叉树,红色/黑色标志模拟2-3行为

就我自己的理解而言,AVL树和RB树在性能方面并不是很遥远。 RB树只是B树的变体,平衡的实现方式与AVL树不同。

答案 2 :(得分:3)

多年来我们对性能差异的理解有所改善,现在使用红黑树而不是AVL的主要原因是无法获得良好的AVL实施,因为它们稍微不那么常见,可能是因为它们没有被覆盖在CLRS。

这两棵树现在都被认为是rank-balanced trees的形式,但红黑树的速度始终慢about 20% in real world tests。甚至在sequential data is inserted时慢30-40%。

所以研究红黑树而不是AVL树的人往往会选择红黑树。红色 - 黑色树木的主要用途详见Wikipedia entry for them

答案 3 :(得分:1)

程序员通常不喜欢动态分配内存。 avl树的问题是对于“n”元素,你需要至少log2(log2(n))...(height-> log2(n))位来存储树的高度! 因此,当您处理大量数据时,无法确定在每个节点上分配多少位来存储高度。

例如,如果使用4个字节int(32位)来存储高度。最大高度可以是:2 ^ 32,因此你可以在树中存储的元素的最大数量是2 ^(2 ^ 32) - (似乎非常大,但在这个数据时代,我猜不会太大)。因此,如果你超过这个限制,你必须动态分配更多的空间来存储高度。

这是我大学教授提出的答案,这对我来说似乎是合理的! 希望我有意义。

编辑:与红黑树相比,AVL树更加平衡,但它们可能会在插入和删除过程中引起更多旋转。因此,如果您的应用程序涉及许多频繁的插入和删除,那么应该首选红黑树。如果插入和删除频率较低且搜索操作更频繁,那么AVL树应优先于红黑树。 - 来源GEEKSFORGEEKS.ORG

答案 4 :(得分:1)

这里的其他答案总结了专业人士和RB和AVL树的缺点很好,但我发现这种差异特别有趣:

  

AVL树不支持持续的摊销更新费用 [但是红黑树会这样做]

来源:Mehlhorn & Sanders (2008)(第7.4节)

因此,虽然RB和AVL树都保证O(log(N))最坏情况下的查找,插入和删除时间,但在插入或删除节点后恢复AVL / RB属性可以在O(1)amortized time中为红黑树做。

答案 5 :(得分:0)

在 AVL 树和 RB 树中的插入都需要最多 2 次旋转。来自https://adtinfo.org/

<块引用>

红黑树的主要优势在于,在 AVL 树中,从包含 n 个节点的树中删除一个节点可能需要 log 2 n 次旋转,但在红黑树中删除不需要超过 3 次旋转。< /p>

答案 6 :(得分:-1)

AVL树的重新平衡应满足以下属性。 (Wiki参考 - AVL Tree

  

在AVL树中,任何节点的两个子子树的高度最多相差一个;如果它们在任何时候相差多于一个,则重新平衡以恢复此属性。

因此,这意味着AVL树的整体高度不会发疯,即AVL树的查找效果会更好。并且由于要进行额外的操作(旋转)以避免高度变粗,树修改操作可能会有点费用。