有人可以解释一下这两种数据结构之间的主要区别是什么吗?我一直试图在网上找到一个突出差异/相似点的资源,但是我没有发现太多有用的信息。在什么情况下,一个会比另一个更受青睐?哪些实际情况使一个“比另一个”更好?
Answers:
AVL树比红黑树保持更严格的平衡。AVL树中从根到最深叶的路径最多为〜1.44 lg(n + 2),而在红黑树中则最多为〜2 lg(n + 1)。
结果,AVL树中的查找通常会更快,但这是以增加旋转操作为代价的较慢的插入和删除为代价的。因此,如果您希望查找次数占主导地位,则使用AVL树。
对于小数据:
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树的旋转上限不变。
从此引述:AVL与红黑树之间的区别
RB树以及AVL树都是自平衡的。它们都提供O(log n)查找和插入性能。不同之处在于,RB-Trees保证每个插入操作旋转O(1)次。这实际上是在实际实现中牺牲性能的原因。简化的RB树从概念上讲是2-3个树,而又不承担动态节点结构的开销,从而获得了这一优势。物理上,RB树被实现为二叉树,红色/黑色标志模拟2-3行为。
根据定义,每个AVL因此都是Red-Black的子集。一个人应该能够为任何AVL树着色,而无需进行重组或旋转,从而将其转换为红黑树。
要了解AVL树的工作原理, 此交互式可视化会帮助。
AVL和RedBlack树是高度平衡的树数据结构。它们非常相似,真正的区别在于在任何添加/删除操作上执行的旋转操作数量-对于AVL,则更高,以保持总体上更均匀的平衡。
两种实现都将其缩放为O(lg N)
,其中N是叶子的数量,但是在实践中,AVL树在查找密集型任务上速度更快:利用更好的平衡性,树的遍历平均较短。另一方面,在插入和删除方面,AVL树较慢:修改后需要大量旋转才能适当地重新平衡数据结构。
对于一般用途的实现(即先验,尚不清楚操作是否占主导地位),首选RedBlack Trees:它们易于实现,并且在常见情况下运行速度更快-数据结构的修改频率与搜索时一样。一个示例,TreeMap
并且TreeSet
在Java中使用支持的RedBlack Tree。
RedBlack树的旋转较少的事实可以使它们在插入/删除时更快,但是..... 由于它们通常更深一些,因此插入和删除操作也可能会变慢。每次您从树中的一个级别转到下一个级别时,都会发生很大的变化,即所请求的信息不在缓存中,必须从RAM中检索。因此,由于旋转次数减少而获得的时间已经丢失,因为它必须进行更深的导航,因此必须更频繁地更新其缓存。是否能够从缓存进行操作有很大的不同。如果相关信息在缓存中,则可以在导航到另一个级别所需的时间内执行多次轮换操作,而下一个级别的信息不在缓存中。因此,如果RedBlack在理论上更快,仅查看所需的操作,则在实践中可能会变慢,
从我所看到的来看,AVL树似乎需要进行尽可能多的旋转(有时以递归方式向上旋转)以获得所需的AVL树的高度(Log n)。这使其更加严格地保持平衡。
对于“红黑树”,您需要确保5套规则以确保不被插入和移除,您可以在http://en.wikipedia.org/wiki/Red-black_tree中找到这些规则。
可能会帮助您获得红黑树的主要事实是,根据这五个规则,如果叔叔是红色的,则可以将树递归着色为根。如果叔叔是黑人,您将需要最多进行两次旋转以解决您遇到的任何问题,但是在完成一轮或两次旋转后,您就完成了。打包并说晚安,因为这是您需要做的操作的结尾。
大法则是数字5 ...“从给定节点到其后代叶子的每个简单路径都包含相同数量的黑色节点”。
这将导致您需要使树工作的大多数旋转,并且不会使树的平衡过大。