AVL树和splay树的区别

Posted

技术标签:

【中文标题】AVL树和splay树的区别【英文标题】:Difference between AVL trees and splay trees 【发布时间】:2011-11-19 23:48:31 【问题描述】:

我正在研究各种树,遇到了 AVL 树和张开树。我想知道

    AVL 树和展开树有什么区别? 我们选择这些树的依据是什么? 这些树的正负分别是什么? 这些树在大 O 表示法方面的表现如何?

【问题讨论】:

这是一个很好的关于伸展树的教学视频:youtu.be/G5QIXywcJlY 你也可以在这个网站上玩它们:cs.usfca.edu/~galles/visualization/SplayTree.html 张开树原论文:cs.cmu.edu/~sleator/papers/self-adjusting.pdf 【参考方案1】:
    AVL 树和展开树有什么区别?

它们在结构和我们调用它们的操作上相似。不同之处在于,在展开树中,在每次操作之后,我们都会尝试使树保持几乎完美的平衡,以便将来的操作花费更少的时间。

    我们选择这些树的依据是什么?

当您的应用程序处理树中的大量数据但需要比其他人更频繁地访问数据子集时,展开树总是比二叉搜索树更好。在这种情况下,由于展开,您经常访问的数据将靠近根目录。此外,任何节点都可以在比以前更短的时间内被访问。

作为选择这些树的一般规则,如果您需要在一段时间内进行树操作的“平均”log(n) 时间,则使用展开树。二叉树不能保证这一点。

    这些树的正负分别是什么?

从理论上讲,这两种数据结构都可以绕过 log(n)。

如上所述,展开树在许多操作中具有平均 log(n)。这意味着,也许您在该集合中至少有一次操作的时间复杂度为 n。但这会在访问频繁项时得到补偿。

二叉搜索树的不利之处在于,您需要幸运地始终拥有 log(n)。如果键不是随机的,那么树将简化为只有一侧的列表形式。

    这些树在大 O 表示法方面的表现如何?

一组树操作的平均展开树 Log(n) 仅当您的密钥是随机的时,二叉树 Log(n)。

运行时的结果很明显here。 您可以看到展开搜索和不展开搜索的运行时差异。

【讨论】:

".. 在展开树中,每次操作之后,我们都尽量保持树几乎完全平衡..",我猜,您的意思是“..在 AVL 树中..” 这个答案只讨论了展开树与二叉搜索树,并忽略了关于 AVL 树的问题,它们具有完全不同的属性。【参考方案2】:

回答您的问题:

    AVL树和splay树有什么区别? splay树和AVL树都是二叉搜索树,性能保证都很好,只是实现方式不同那些保证性能。在 AVL 树中,树的形状始终受到约束,因此树的形状是平衡的,这意味着树的高度永远不会超过 O(log n)。此形状在插入和删除时保持不变,并且在查找期间不会更改。另一方面,展开树通过重塑树以响应对其的查找来保持高效。这样,经常访问的元素会向上移动到树的顶部,并具有更好的查找时间。展开树的形状不受限制,并根据执行的查找而变化。

    我们选择这些树的依据是什么?对此没有硬性规定。然而,结构之间的一个关键区别是 AVL 树保证每个操作的快速查找 (O(log n)),而 splay 树只能保证 n 操作的任何序列最多花费 O(n log n) 时间。这意味着如果您需要实时查找,AVL 树可能会更好。但是,平均而言,展开树往往要快得多,因此,如果您想最小化树查找的总运行时间,则展开树可能会更好。此外,splay tree 非常有效地支持一些操作,例如拆分和合并,而相应的 AVL 树操作涉及更多且效率较低。展开树比 AVL 树更节省内存,因为它们不需要在节点中存储平衡信息。但是,AVL 树在具有大量查找的多线程环境中更有用,因为在 AVL 树中的查找可以并行完成,而在展开树中则不能。因为 splay 树会根据查找来重塑自身,所以如果您只需要访问树元素的一小部分子集,或者如果您访问的某些元素比其他元素多得多,则 splay 树的性能将优于 AVL 树。最后,展开树往往比 AVL 树更容易实现,因为旋转逻辑要容易得多。

    这些树的优点和缺点是什么?请参阅我对上述 (2) 的回答。

    这些树在大 O 表示法方面的性能如何? AVL 树的插入、删除和查找都需要 O(log n) 时间。展开树具有这些相同的保证,但保证仅在摊销的意义上。任何长序列的操作最多需要 O(n log n) 时间,但单个操作可能需要 O(n) 时间。

希望这会有所帮助!

【讨论】:

>> Splay 树比 AVL 树更节省内存,因为它们不需要在节点中存储余额信息,但是 AVL 树每个节点需要多少内存? @4esn0k- 您需要存储三个不同的平衡因子之一(-1、0 或 +1)。但是,通常情况下,没有开销,因为存储它所需的两位可以打包到左指针和右指针中。

以上是关于AVL树和splay树的区别的主要内容,如果未能解决你的问题,请参考以下文章

详解 AVL 树和红黑树的区别

红黑树和AVL树的区别

说一下B+tree和二叉搜索树的区别?说一下二叉搜索树和AVL树红黑树之间的差别

二叉搜索树的平衡--AVL树和树的旋转

二叉搜索树的平衡--AVL树和树的旋转(图解)

AVL树和红黑树的模拟实现