红黑树和AVL树之间的区别


82

有人可以解释一下这两种数据结构之间的主要区别是什么吗?我一直试图在网上找到一个突出差异/相似点的资源,但是我没有发现太多有用的信息。在什么情况下,一个会比另一个更受青睐?哪些实际情况使一个“比另一个”更好?

Answers:


100

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

结果,AVL树中的查找通常会更快,但这是以增加旋转操作为代价的较慢的插入和删除为代价的。因此,如果您希望查找次数占主导地位,则使用AVL树。


3
要求更好地理解概念。avl树和Red Black树每次插入最多具有两个旋转。那么,怎么说AVL树很慢?提前致谢!
user2626445 2014年

@larsmans!性能差异是如此之大以至于创建了一个新概念吗?
2014年

@Shashwat我不明白你的意思。新概念?
Fred Foo 2014年

2
@larsmans!我的意思是为什么拥有AVL树时我们为什么拥有红黑树的概念如此出名,尽管它们的插入,删除和更新性能只有微小的差异。有什么专业使Red-Black树与AVL树不同?
2014年

维护它们的算法不同,因此它们具有不同的名称。AFAIK,它们支持具有相同big-O时限的同一组操作。
福雷

54

对于小数据

insert:RB树和avl树的最大旋转数不变,但是RB树会更快,因为平均而言RB树使用较少的旋转。

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

delete:RB树的最大旋转数不变,但AVL树的O(log N)旋转次数最差。平均而言,RB树的旋转次数也较少,因此RB树更快。

对于大数据

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

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

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


2
这似乎意味着AVL树几乎总是被大量数据所青睐。它如何在Java和C ++ STL中使用?stackoverflow.com/questions/3901182/...
emschorsch

在插入/删除情况下,您需要一定数量的数据(例如100万)才能使AVL树优于RB树,这实际上取决于您如何实现它。一个智能的AVL实现甚至可以在数据量较少的情况下击败std :: map。例如,你不需要检查孩子和孙子是否为空,如果父- >高度大于5
杜海嘉恩

这是一个很好的分析,应该作为数据结构任何形式的比较的典范。优于公认的答案
pterodragon

1
作为“小数据”的简短总结,我从中得出的结论是:AVL可以做更多的前期工作,并且更加严格(写入/旋转),以提高以后的性能(读取)。随着数据的增长,读取变得越来越重要,因为读取的内容要多于写入的内容(与搜索相比,轮换的意义不大)。因此,AVL在所有方面均获胜,因为它已针对阅读进行了优化。
Ben Butterworth

8

从此引述:AVL与红黑树之间的区别

RB树以及AVL树都是自平衡的。它们都提供O(log n)查找和插入性能。不同之处在于,RB-Trees保证每个插入操作旋转O(1)次。这实际上是在实际实现中牺牲性能的原因。简化的RB树从概念上讲是2-3个树,而又不承担动态节点结构的开销,从而获得了这一优势。物理上,RB树被实现为二叉树,红色/黑色标志模拟2-3行为。

根据定义,每个AVL因此都是Red-Black的子集。一个人应该能够为任何AVL树着色,而无需进行重组或旋转,从而将其转换为红黑树。


3

经常将AVL树与红黑树进行比较,因为它们都支持相同的操作集并花费一些O(log n)时间进行基本操作。对于查找密集型应用程序,AVL树比红黑树更快,因为它们具有更严格的平衡。类似于红黑树,AVL树是高度平衡的。通常,对于任何≤½的情况,两者都不平衡重量,也不平衡。也就是说,同级节点的后代数量可能相差很大。

摘自AVL树的维基百科文章


3

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


3

要了解AVL树的工作原理, 交互式可视化会帮助。

AVL和RedBlack树是高度平衡的树数据结构。它们非常相似,真正的区别在于在任何添加/删除操作上执行的旋转操作数量-对于AVL,则更高,以保持总体上更均匀的平衡。

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

对于一般用途的实现(即先验,尚不清楚操作是否占主导地位),首选RedBlack Trees:它们易于实现,并且在常见情况下运行速度更快-数据结构的修改频率与搜索时一样。一个示例,TreeMap并且TreeSet在Java中使用支持的RedBlack Tree。


2

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


1

从我所看到的来看,AVL树似乎需要进行尽可能多的旋转(有时以递归方式向上旋转)以获得所需的AVL树的高度(Log n)。这使其更加严格地保持平衡。

对于“红黑树”,您需要确保5套规则以确保不被插入和移除,您可以在http://en.wikipedia.org/wiki/Red-black_tree中找到这些规则。

可能会帮助您获得红黑树的主要事实是,根据这五个规则,如果叔叔是红色的,则可以将树递归着色为根。如果叔叔是黑人,您将需要最多进行两次旋转以解决您遇到的任何问题,但是在完成一轮或两次旋转后,您就完成了。打包并说晚安,因为这是您需要做的操作的结尾。

大法则是数字5 ...“从给定节点到其后代叶子的每个简单路径都包含相同数量的黑色节点”。

这将导致您需要使树工作的大多数旋转,并且不会使树的平衡过大。


1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.