我发现一些在线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];
}
我想知道我是否遗漏了什么,为什么在大多数在线教程中都没有讨论过这种技术?
答案 0 :(得分:1)
我想知道是否遗漏了什么,为什么大多数在线教程中都没有讨论这种技术?
这类在线教程没有正确使用路径压缩启发式方法(如您所知),或者没有提及它,因为很难证明其真实运行时间,或者他们没有加以证明就提及了它。
我不是在线教程的粉丝,因此我无法真实地说出我暴露的3个原因中哪一个是最常见的。我能告诉您的是,在算法入门(Cormen),第3版,第569和570页中,您可以很好地说明路径压缩启发式方法以及所包含的图像。另外,如果您正在寻找实际运行时间的证明,请从第573页开始阅读(阅读量很大,值得)。
也许它在在线教程中并不流行,但是必须知道它在CS学位中的存在。