红黑树和AVL树之间的区别

时间:2013-04-27 23:02:14

标签: data-structures tree language-agnostic avl-tree red-black-tree

有人可以解释这两种数据结构之间的主要区别是什么吗?我一直试图在网上找到一个突出差异/相似之处的来源,但我没有找到任何太丰富的信息。在哪种情况下,一个人比另一个人更受欢迎?什么样的实际情况使得一个人比另一个人“更好”?

9 个答案:

答案 0 :(得分:95)

AVL树比红黑树保持更加严格的平衡。 AVL树中从根到最深叶的路径最多为~1.44 lg(n + 2),而在红黑树中最多为~2 lg(n + 1)。

因此,在AVL树中查找通常会更快,但这会因为更多的旋转操作而导致插入和删除速度变慢。因此,如果您希望查找次数占据树的更新次数,请使用AVL树。

答案 1 :(得分:44)

小数据

插入:RB树& avl树具有恒定的最大旋转次数但RB树将更快,因为平均RB树使用较少的旋转。

查找:AVL树速度更快,因为AVL树的深度较小。

删除:RB树具有恒定的最大旋转次数,但AVL树可以将O(log N)次旋转视为最差。平均而言,RB树的旋转次数也较少,因此RB树更快。

适用于大数据

插入:AVL树更快。因为您需要在插入之前查找特定节点。当您有更多数据时,查找特定节点的时间差异与O(log N)成比例增长。但是AVL树&在最坏的情况下,RB树仍然只需要恒定的旋转次数。因此,瓶颈将成为您查找该特定节点的时间。

查找:AVL树更快。 (与小数据情况相同)

删除:AVL树平均速度更快,但在最坏的情况下,RB树速度更快。因为您还需要在删除之前查找非常深的节点以进行交换(类似于插入的原因)。平均而言,两棵树都有恒定的旋转次数。但RB树有一个恒定的上限。

答案 2 :(得分:8)

引用此词:Difference between AVL and Red-Black Trees

  

RB-Trees和AVL树一样,是自平衡的。它们都提供O(log n)查找和插入性能。   不同之处在于RB-Trees保证每次插入操作的O(1)旋转。这实际上是实际成本中的性能成本。   简化后,RB-Trees从概念上成为2-3个树,而不会带来动态节点结构的开销。物理RB-Trees实现为二叉树,红色/黑色标志模拟2-3行为。

     

根据定义,每个AVL因此是Red-Black的子集。一个人应该能够在没有重组或旋转的情况下为任何AVL树着色,将其转换为红黑树。

答案 3 :(得分:3)

  

AVL树通常与红黑树进行比较,因为它们都支持相同的操作集,并且基本操作需要O(log n)时间。对于查找密集型应用程序,AVL树比红黑树快,因为它们更加严格平衡。与红黑树类似,AVL树是高度平衡的。对于任何μ≤½,两者通常不是重量平衡的,也不是μ平衡的;也就是说,兄弟节点可以有很多不同数量的后代。

来自维基百科关于AVL Trees的文章

答案 4 :(得分:3)

树木的最大高度是保持平衡的最重要因素。对于AVL,它几乎等于1.44 * log(n),但对于RB树,它是2 * log(n)。因此,我们可以得出结论,当问题是搜索激励时,最好使用AVL。重要的是AVL和RB树的另一个问题。当以较低的旋转成本面向随机插入时,RB树优于AVL,但是有利于插入上升或下降数据的AVL。所以如果问题是插入激励,我们可以使用RB树。

答案 5 :(得分:2)

RedBlack树旋转较少的事实可以使它们在插入/删除时更快,但....因为它们通常更深一些它们在插入和删除时也会更慢。每次从树中的一个级别转到下一个级别时,所请求的信息不在缓存中并且必须从RAM中检索,这是一个很大的变化。 因此,在较少轮换时获得的时间已经丢失,因为它必须更深入地导航,因此必须更频繁地更新其高速缓存。能否使用缓存进行操作会产生很大的不同。如果相关信息在缓存中,那么您可以在导航附加级别所需的时间内执行多次旋转操作,并且下一级别信息不在缓存中。 因此,如果RedBlack在理论上更快,仅查看所需的操作,由于缓存未命中,实际上可能会更慢。

答案 6 :(得分:1)

从我所看到的情况来看,似乎AVL Trees根据需要进行尽可能多的旋转(有时递归树),以获得AVL树(Log n)的所需高度。这使它更加严格平衡。

对于红黑树,您需要有5组规则,以确保通过插入和移除保留,您可以在此处找到http://en.wikipedia.org/wiki/Red-black_tree

对于红黑树可能有帮助的主要事实是,根据这五条规则,如果叔叔是红色的,你可以递归地将树颜色调到根。如果叔叔是黑人你需要做最多两次轮换来解决你遇到的任何问题,但是在你做完一两次轮换之后。收拾它并说晚安,因为这是你需要做的操作的结束。

大规则是5号......     '从给定节点到其任何后代叶子的每条简单路径都包含相同数量的黑色节点。

这将导致您需要的大部分轮换使树工作,并导致树不会太远失去平衡。

答案 7 :(得分:1)

总结:AvlTrees比RedBlackTrees更平衡。两个树总共需要O(log n)时间用于查找,插入和删除,但是对于插入和删除,前者需要O(log n)旋转,而后者仅需要O(1)旋转。

由于轮换意味着写入内存,并且写入内存的成本很高,因此实际上RedBlackTrees的更新速度比AvlTrees更快

答案 8 :(得分:1)

为了了解AVL树的工作原理,this交互式可视化有助于。

AVL以及RedBlack树是高度平衡的树数据结构。它们非常相似,真正的区别在于在任何添加/删除操作时完成的旋转操作次数 - 在AVL的情况下更高,以保持整体更均匀的平衡。

两种实现都缩放为O(lg N),其中N是叶子数,但实际上AVL树在查找密集型任务上更快:利用更好的平衡,树遍历平均更短。另一方面,插入和删除方面,AVL树速度较慢:需要更高的旋转次数才能在修改时正确地重新平衡数据结构。

对于通用实现(即先验并不清楚查找是否是操作的主要部分),RedBlack树是首选:它们更容易实现,并且在常见情况下更快 - 无论数据结构被修改为何处经常搜索。 Java中的一个示例TreeMapTreeSet使用了支持RedBlack树。