【发布时间】:2012-11-30 22:20:45
【问题描述】:
AVL 和红黑树都是自平衡的,除了节点中的红色和黑色。选择红黑树而不是 AVL 树的主要原因是什么?红黑树的应用有哪些?
【问题讨论】:
-
顺便说一句,Rust 开发人员选择使用B-tree 而不是其中任何一个作为标准有序映射。
标签: algorithm data-structures red-black-tree
AVL 和红黑树都是自平衡的,除了节点中的红色和黑色。选择红黑树而不是 AVL 树的主要原因是什么?红黑树的应用有哪些?
【问题讨论】:
标签: algorithm data-structures red-black-tree
选择红黑树而不是AVL树的主要原因是什么?
red-black trees 和AVL trees 都是最常用的balanced binary search trees,它们支持在保证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 至少使用了红黑树,而且看起来你在实践中是对的。
尝试阅读此article
它提供了关于差异、相似之处、性能等方面的一些很好的见解。
这是文章的引述:
RB-Tree 和 AVL 树一样是自平衡的。它们都提供 O(log n) 的查找和插入性能。
不同之处在于 RB-Trees 保证每个插入操作的 O(1) 次旋转。这就是在实际实现中实际会降低性能的原因。
简化后,RB-Trees 从概念上是 2-3 棵树获得了这一优势,而无需承担动态节点结构的开销。物理上 RB-Trees 实现为二叉树,红/黑标志模拟 2-3 行为
就我自己的理解而言,AVL 树和 RB 树在性能方面相差不远。 RB 树只是 B 树的变体,平衡的实现方式与 AVL 树不同。
【讨论】:
多年来,我们对性能差异的理解有所提高,现在在 AVL 上使用红黑树的主要原因是无法获得良好的 AVL 实现,因为它们不太常见,可能是因为它们没有被涵盖在 CLRS 中。
这两种树现在都被视为rank-balanced trees 的形式,但红黑树始终比about 20% in real world tests 慢。 sequential data is inserted 时甚至会慢 30-40%。
所以研究过红黑树但没有研究过AVL树的人倾向于选择红黑树。红黑树的主要用途详见Wikipedia entry for them。
【讨论】:
这里的其他答案很好地总结了 RB 和 AVL 树的优缺点,但我发现这种差异特别有趣:
AVL 树不支持常量摊销更新成本 [但红黑树支持]
来源:Mehlhorn & Sanders (2008)(第 7.4 节)
因此,尽管 RB 和 AVL 树都保证 O(log(N)) 最坏情况下的查找、插入和删除时间,但在插入或删除节点之后恢复 AVL/RB 属性可以对于红黑树,在 O(1) amortized time 中完成。
【讨论】:
AVL 树和 RB 树中的插入都需要最多 2 次旋转。来自https://adtinfo.org/:
红黑树的主要优点是,在 AVL 树中,从包含 n 个节点的树中删除一个节点可能需要 log 2 n 次旋转,但在红黑树中删除永远不需要超过 3 次旋转。
【讨论】: