除了节点中的红色和黑色外,AVL和红色黑树都是自平衡的。选择红黑树而不是AVL树的主要原因是什么?红黑树有哪些应用?
除了节点中的红色和黑色外,AVL和红色黑树都是自平衡的。选择红黑树而不是AVL树的主要原因是什么?红黑树有哪些应用?
Answers:
选择红黑树而不是AVL树的主要原因是什么?
无论红黑树和AVL树是最常用的平衡二叉搜索树,它们支持插入,删除和查询的保证O(logN) time
。但是,两者之间存在以下比较点:
O(N)
额外的空间。但是,如果我们知道将要插入树中的键始终大于零,则可以使用键的符号位来存储红黑树的颜色信息。因此,在这种情况下,红黑树不会占用额外的空间。红黑树有哪些应用?
红黑树更通用。它们在添加,删除和查找方面表现相对较好,但AVL树的查找速度更快,但添加/删除速度较慢。红黑树用于以下用途:
java.util.TreeMap
、java.util.TreeSet
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
是不正确的。
std:: map
朋友使用任何特定结构。这留给实现,尽管libstdc ++和Dinkumware至少使用红黑树,并且看来您在实践中是正确的。
尝试阅读这篇文章
它提供了关于差异,相似性,性能等的一些很好的见解。
这是文章的引文:
RB树以及AVL树都是自平衡的。它们都提供O(log n)查找和插入性能。
不同之处在于,RB-Trees保证每次插入操作的旋转次数为O(1)。这实际上是在实际实现中牺牲性能的原因。
简化的RB树从概念上讲是2-3个树,而又不承担动态节点结构的开销,从而获得了这一优势。物理上RB树被实现为二叉树,红色/黑色标志模拟2-3行为
就我自己的理解而言,AVL树和RB树在性能方面相差不远。RB树只是B树的一种变体,并且平衡的实现方式不同于AVL树。
多年来,我们对性能差异的了解有所提高,现在,在AVL上使用红黑树的主要原因是无法获得良好的AVL实施,因为它们不太常见,也许是因为它们未包含在CLRS中。
现在,这两棵树都被认为是等级平衡树的形式,但是在现实世界的测试中,红黑树的速度始终降低约20%。插入顺序数据后,速度甚至会降低30-40%。
因此,研究过红黑树而不是AVL树的人们倾向于选择红黑树。红黑树的主要用途在Wikipedia条目中有详细介绍。
这里的其他答案很好地总结了RB和AVL树的利弊,但我发现这种区别特别有趣:
AVL树不支持固定的摊销更新成本 [但是红黑树则支持]
资料来源:Mehlhorn&Sanders(2008)(第7.4节)
因此,尽管RB树和AVL树都保证O(log(N))最坏情况下的查找时间,但是插入和删除时,插入或删除节点后恢复AVL / RB属性仍可以在O(1)的摊销时间内完成。红黑的树木。
程序员通常不喜欢动态分配内存。Avl树的问题在于,对于“ n”个元素,您需要至少log2(log2(n))...(height-> log2(n))位来存储树的高度!因此,当您处理大量数据时,您无法确定要分配多少位来存储每个节点的高度。
例如,如果您使用4个字节的int(32位)存储高度。最大高度可以是:2 ^ 32,因此可以在树中存储的最大元素数是2 ^(2 ^ 32)-(似乎很大,但是在这个数据时代,我猜没有什么太大的)。因此,如果您超出此限制,则必须动态分配更多空间来存储高度。
这是我大学的教授提出的答案,对我来说似乎很合理!希望我有道理。
编辑:与红黑树相比,AVL树更加平衡,但是它们可能会在插入和删除过程中引起更多旋转。因此,如果您的应用程序涉及许多频繁的插入和删除操作,则应首选Red Black树。而且,如果插入和删除操作的频率较低,而搜索操作的频率较高,则AVL树应优先于Red Black Tree。-来源GEEKSFORGEEKS.ORG
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
我不需要AVL树中任何节点的高度来实现它。你娘家一个比特的额外信息为每个节点(我就是最大的(与该最高兄弟子树))); 如AV&L所示,拥有两个额外的位(子级较高,左和右较高)比常规方式更方便和方便
重新平衡AVL树应满足以下属性。(Wiki参考-AVL树)
在AVL树中,任何节点的两个子树的高度最多相差1个。如果它们之间的任何时间差超过一个,则将进行重新平衡以恢复此属性。
因此,这意味着AVL树的整体高度不会发疯,即使用AVL树进行查找会更好。并且由于要进行附加的操作(旋转)以不使高度变差,因此树修改操作可能会有点昂贵。