我发现一些在线union-find 教程描述了路径压缩技术,甚至比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];
}
我想知道我是否遗漏了什么,为什么大多数在线教程都没有讨论这种技术?