为什么展开树旋转算法会同时考虑父节点和祖父母节点?


25

我不太了解为什么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
}

那应该避免整个“花花公子”程序,你不觉得吗?

Answers:


30

最简单的平衡算法在最坏的情况下每转可能需要摊销时间。假设树只是正确的孩子完全不平衡的路径;没有节点有左子节点。该树中唯一的叶子是具有最大密钥的树。如果将此步骤逐步旋转到根,则使用了n 1圈,结果树仍然完全不平衡。Ω(n)n1

只是旋转的坏例子

n2/2Ω(n)Ω(n)

不好的例子还在继续

这个不好的例子出现在Sleator和Tarjan的原始八卦树纸中。

xxx

夸大坏榜样

这种更复杂的算法的优势在于,它不仅将被访问的节点带到根,而且还将被访问节点的每个祖先大约移动到根的中途,而且永远不会将任何节点移动超过距离节点恒定数量的级别。根。

O(logn)Ω(n)

简而言之:扩展使节点快速向上和向下缓慢移动。


我认为旋转算法完全相同,我的算法更短,更容易理解。与其看着祖父母,不如我只考虑父母一步。它不会产生完全相同的结果吗?
Bober02年

我猜您可能是指两种SPLAYING算法,一种自上而下,另一种自下而上,而不是我的,这是正确的吗?我指的是我的算法中VS自下而上的张开
Bober02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.