联合 - 查找路径压缩效率

时间:2017-11-13 04:49:51

标签: algorithm time-complexity disjoint-sets union-find

我发现一些在线union-find tutorial描述的路径压缩技术,O(log(N))的复杂度甚至低于find(),下面是此博客中的路径压缩实现,

int root (int Arr[], int i) {
    while(Arr[i] != i) {
        Arr[i] = Arr[ Arr[i] ]; 
        i = Arr[i]; 
    }
   return i;
}

我看到这个实现只减少了一半的路径,并且可以使用下面的递归技巧进行更多的压缩,

int recurse_root (int Arr[], int i) {
    if ( i == Arr[i] ){
        return i;
    }
    Arr[i] = recurse_root( Arr, Arr[i] )
    return A[i];
}

我想知道我是否遗漏了什么,为什么在大多数在线教程中都没有讨论过这种技术?

1 个答案:

答案 0 :(得分:1)

我想知道是否遗漏了什么,为什么大多数在线教程中都没有讨论这种技术?

这类在线教程没有正确使用路径压缩启发式方法(如您所知),或者没有提及它,因为很难证明其真实运行时间,或者他们没有加以证明就提及了它。

我不是在线教程的粉丝,因此我无法真实地说出我暴露的3个原因中哪一个是最常见的。我能告诉您的是,在算法入门(Cormen),第3版,第569和570页中,您可以很好地说明路径压缩启发式方法以及所包含的图像。另外,如果您正在寻找实际运行时间的证明,请从第573页开始阅读(阅读量很大,值得)。

也许它在在线教程中并不流行,但是必须知道它在CS学位中的存在。