【问题标题】:Splay tree rotation algorithm: Why use zig-zig and zig-zag instead of simpler rotations?展开树旋转算法:为什么使用 zig-zig 和 zig-zag 而不是更简单的旋转?
【发布时间】:2012-04-10 22:21:07
【问题描述】:

我不太明白为什么splay树数据结构中的旋转不仅考虑了评级节点的父节点,还考虑了祖父节点(zig-zag 和 zig-zig 操作)。为什么以下不起作用:

例如,当我们向树中插入一个新节点时,我们会检查我们是插入左子树还是右子树。如果我们插入到左边,我们将结果向右旋转,右子树反之亦然。递归会是这样的

Tree insert(Tree root, Key k){
    if(k < root.key){
        root.setLeft(insert(root.getLeft(), key);
        return rotateRight(root);
    }
    //vice versa for right subtree
}

这应该避免整个“展开”过程,你不觉得吗?

【问题讨论】:

  • 运行测试版Computer Science 网站的人们可能真的很乐意帮助您解决这个问题。
  • 这与本网站无关吗?
  • 我会说它是相关的,但是自从 CS 网站最近成立以来,像您这样的算法问题可能更接近 CS 感兴趣的领域。此外,它们处于测试阶段,因此他们肯定会喜欢增加的流量和更多的主题问题。

标签: data-structures tree rotation splay-tree tree-balancing


【解决方案1】:

您在树上提出的算法称为“移动到根”启发式算法,并在on page four of Sleator and Tarjan's original paper on splay trees. 进行了讨论@ 他们引用了 Allen 和 Munro 的一篇较早的论文,其中表明如果您尝试使用 move- to-root 作为一种重塑树的方法,每次查找的摊销成本可能为 O(n),这非常慢。展开是一种非常精心设计的用于重塑树的算法,无论执行何种访问顺序,它都能保证平均 O(log n) 查找。

直观地说,移动到根不是重塑树的好方法,因为它会向下移动从节点到根的路径上的所有节点,同时试图使访问的节点在将来更容易到达。因此,在执行此版本的树重组时,整体树可能会变得更糟。另一方面,splay 方法倾向于降低展开节点及其访问路径上所有节点的高度,这意味着整体上树在展开期间趋于变得更好。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多