我正在研究各种树木,并遇到了AVL树木和树木。我想知道
答案 0 :(得分:72)
splay树和AVL树都是具有出色性能保证的二叉搜索树,但它们在如何保证性能方面存在差异。在AVL树中,树的形状始终受到约束,使树形状平衡,这意味着树的高度永远不会超过O(log n)。此形状在插入和删除时保持不变,并且在查找期间不会更改。另一方面,Splay树通过重新形成树来响应对其的查找而保持高效。这样,经常访问的元素向上移动到树的顶部并具有更好的查找时间。展开树的形状不受约束,并根据执行的查找而变化。
对此没有严格的规定。但是,结构之间的一个关键区别是AVL树保证在每个操作上快速查找(O(log n)),而splay树只能保证n个操作的任何序列最多需要O(n log n)时间。这意味着如果您需要实时查找,AVL树可能会更好。但是,splay树的平均速度往往要快得多,因此如果要最小化树查找的总运行时间,splay树可能会更好。另外,splay树支持一些操作,例如非常有效地分割和合并,而相应的AVL树操作更复杂且效率更低。 Splay树比AVL树更具内存效率,因为它们不需要在节点中存储余额信息。但是,AVL树在具有大量查找的多线程环境中更有用,因为AVL树中的查找可以并行完成,而不能在splay树中进行。因为splay树基于查找重塑自己,如果您只需要访问树的一小部分元素,或者如果您访问某些元素比其他元素更多,则splay树将胜过AVL树。最后,splay树比AVL树更容易实现,因为旋转逻辑更容易。
见(2)
AVL树的插入,删除和查找每次都需要O(log n)时间。 Splay树有这些相同的保证,但保证只是在摊销意义上。任何长时间的操作都将花费最多O(n log n)时间,但单个操作可能需要花费O(n)时间。
希望这有帮助!
答案 1 :(得分:3)
1)AVL树和splay树之间有什么区别?
它们的结构和我们调用它们的操作类似。不同之处在于,在splay树中,每次操作后,我们都会尝试使树几乎完全平衡,以便将来的操作花费更少的时间。
2)我们在什么基础上选择这些发辫?
当您的应用程序处理树中的大量数据时,Splay树总是优于二叉搜索树,但是,需要比其他树更频繁地访问数据的子集。在这种情况下,由于展开,您经常访问的数据将接近根。此外,可以用比以前更少的时间访问任何节点。
作为选择这些树的一般规则,如果在一段树操作期间需要“平均”log(n)时间,则使用splay树。二叉树不能保证这一点。
3)这些树的正面和负面是什么?
两者的积极因素是你从理论上解决了这两个数据结构中的log(n)。
如上所述,splay树在许多操作中具有平均log(n)。这意味着,也许你在该集合中至少有一次操作至少一次。但是,当访问频繁项目时,这将得到补偿。
二叉搜索树的负面影响是,你需要幸运的是总是有log(n)。如果键不是随机的,那么树将缩减为只有一侧的表单。
4)这些树在大O符号方面有什么表现?
一组树操作的Splay树Log(n)on Average。 二叉树只有当你的密钥随机出现时才记录(n)。
运行时的结果显而易见splay tree runtime profiling 您可以在使用和不使用splaying的情况下查看运行时的差异。