ZigZag和ZigZig在splay树中运行?

时间:2015-01-02 12:26:28

标签: c data-structures tree splay-tree

考虑我的树就像这样

                 5
                / \
               3   7
              / \ / \
             2  4 6  8

当我们搜索元素2时,将执行zigzig操作,所以首先 我们轮换parent and ancestor of 2,然后轮换parent and 2

在相同的情况下,考虑我们正在搜索4,那时将执行之字形操作。首先,我们轮换4 and its parent,然后4 and its ancestor将会轮换。

为什么我们这样做,在曲折中,为什么我们不旋转parent and ancestor而不是searching node and parent

请解释一下?在此先感谢。

1 个答案:

答案 0 :(得分:1)

轮换顺序很重要。这就是使得每次操作的分析产生O(lg n)时间在一系列m次操作中摊销的原因。 splay(x)启发式将节点x移动到树的根,但不是仅旋转x直到它成为根,zigzig步骤首先旋转x的父级然后旋转x。例如,如果我们只是旋转x直到它成为根,那么分析将不会产生有用的东西。

你在这里描述不同的东西。您希望始终先旋转父级,然后旋转子级。你需要正式证明这种启发式方法如果你认为是好的,但要回答这个问题:splay树中的旋转顺序保证O(m lg n)限制在一系列m次操作中。