在avl树的红色黑树

AVL和红黑树都是自平衡的,除了红色和黑色的节点。 select红黑树而不是AVL树的主要原因是什么? 红黑树有什么用途?

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

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

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

红黑树有什么用途?

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

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

尝试阅读这篇文章

它提供了一些有关差异,相似性,性能等方面的很好的见解。

这里有一篇文章的引用:

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

不同的是RB-Trees保证每个插入操作的O(1)旋转。 这实际上是在实际执行中花费性能的成本。

简化的RB树从概念上是从2-3树中获得这个优点,而不会带来dynamic节点结构的开销。 物理RB树被实现为二叉树,红/黑旗模拟2-3行为

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

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

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

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

编辑:与红黑树相比,AVL树更加平衡,但是在插入和删除过程中可能会引起更多的旋转。 所以如果你的应用程序涉及很多频繁的插入和删除,那么红黑树应该是首选。 如果插入和删除的频率较低,search操作更频繁,那么AVL树应优先于红黑树。 – 来源GEEKSFORGEEKS.ORG

AVL树的重新平衡应该符合下面的属性。 (维基参考 – AVL树 )

在AVL树中,任意节点的两个子子树的高度最多相差一个; 如果在任何时候它们相差超过一个,则重新平衡以恢复这个财产。

所以这意味着AVL树的整体高度不会发生变化,即AVL树的查找效果会更好。 而且由于要做额外的操作(旋转)而不让高度发疯,所以树修改操作可能会花费很大的代价。

其他的答案在这里总结了RB和AVL树的优点和缺点,但是我发现这个区别特别有趣:

AVL树不支持不断的摊销更新成本 [但红黑树]

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

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

我们对性能差异的理解多年来有所改善,现在使用红黑树超过AVL的主要原因是没有获得良好的AVL实现,因为它们稍微不太常见,也许是因为它们不在CLRS中。

现在,这两棵树被认为是平衡树木的forms,但在现实世界的testing中,红黑树木一直比现在慢20%左右 。 甚至在插入顺序数据时速度降低30-40%。

所以研究过红黑树而不是AVL树的人倾向于select红黑树。 红黑树的主要用途详见Wikipedia条目 。