Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 红黑树与AVL树的区别_Data Structures_Tree_Language Agnostic_Avl Tree_Red Black Tree - Fatal编程技术网

Data structures 红黑树与AVL树的区别

Data structures 红黑树与AVL树的区别,data-structures,tree,language-agnostic,avl-tree,red-black-tree,Data Structures,Tree,Language Agnostic,Avl Tree,Red Black Tree,有人能解释一下这两种数据结构之间的主要区别吗?我一直试图在网上找到一个能突出不同点/相似点的信息来源,但我没有发现任何信息太丰富的信息。在什么情况下,一个优先于另一个?什么样的实际情况使一个比另一个“更好”地使用?引述如下: RB树和AVL树都是自平衡的。它们都提供了O(logn)查找和插入性能。 不同之处在于RB树保证每次插入操作都有O(1)个旋转。这就是在实际实现中实际降低性能的原因。 简化后的RB树从概念上是2-3棵树而不需要携带动态节点结构的开销中获得了这一优势。实际上,RB树实现为二叉

有人能解释一下这两种数据结构之间的主要区别吗?我一直试图在网上找到一个能突出不同点/相似点的信息来源,但我没有发现任何信息太丰富的信息。在什么情况下,一个优先于另一个?什么样的实际情况使一个比另一个“更好”地使用?

引述如下:

RB树和AVL树都是自平衡的。它们都提供了O(logn)查找和插入性能。 不同之处在于RB树保证每次插入操作都有O(1)个旋转。这就是在实际实现中实际降低性能的原因。 简化后的RB树从概念上是2-3棵树而不需要携带动态节点结构的开销中获得了这一优势。实际上,RB树实现为二叉树,红色/黑色标志模拟2-3行为

根据定义,每个AVL都是红黑的子集。人们应该能够为任何AVL树着色,而无需重新构造或旋转,从而将其转换为红黑树


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

对于红黑树,有5组规则需要确保在插入和删除过程中保持不变,您可以在此处找到这些规则

对于红黑树来说,最主要的帮助是,根据这五条规则,如果叔叔是红色的,你可以递归地将树着色到树根。如果叔叔是黑人,你需要做最多两次旋转来解决任何问题,但在那一两次旋转之后,你就完成了。收起它,说声晚安,因为这就是你需要做的操纵的结束

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


这将导致树工作所需的大部分旋转,并使树不会失去平衡。

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

因此,AVL树中的查找速度通常较快,但由于旋转操作较多,因此插入和删除速度较慢。因此,如果您希望查找的数量控制树的更新数量,请使用AVL树

AVL树通常与红黑树相比较,因为两者都支持相同的操作集,并且基本操作需要
O(logn)
时间。对于查找密集型应用程序,AVL树比红黑树更快,因为它们更严格地平衡。与红黑树相似,AVL树高度平衡。一般来说,两者都不平衡重量,也不平衡任何μ≤ ½; 也就是说,同级节点的子节点数量可能相差很大


从维基百科上的文章来看,树木的最大高度对于保持平衡至关重要。对于AVL,它几乎等于
1.44*log(n)
,但是对于RB树,它是
2*log(n)
。因此,我们可以得出结论,当问题是搜索激励时,最好使用AVL。重要的是AVL和RB树的另一个问题。RB-tree在以较低的旋转成本面对随机插入时优于AVL,而AVL则有利于插入升序或降序数据。因此,如果问题是插入激励,我们可以使用RB树

对于小数据

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

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

删除:RB树的最大旋转次数是恒定的,但AVL树的旋转次数可以是最差的。平均而言,RB树的旋转次数也较少,因此RB树的旋转速度更快

对于大数据

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

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


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

总之:AvlTrees比RedBlackTrees稍微平衡一些。对于查找、插入和删除,这两个树总共需要O(logn)时间,但是对于插入和删除,前者需要O(logn)旋转,而后者只需要O(1)旋转


由于旋转意味着写入内存,并且写入内存的成本很高,因此红黑树实际上比AvlTrees更新得更快。要了解AVL树的工作原理,交互式可视化会有所帮助

AVL和红黑树都是高度平衡的树数据结构。它们非常相似,真正的区别在于在任何添加/删除操作中执行的旋转操作的数量——在AVL的情况下更高,以保持整体更均匀的平衡

这两种实现都以
O(lg N)
的形式进行扩展,其中N是叶数,但实际上,AVL树在查找密集型任务上更快