我正在学习联合/查找结构的“带路径压缩的加权快速联合”算法。普林斯顿教育网站详细解释了该算法。这是Java中的实现:
public class WQUPC {
private int[] id;
private int[] sz;
public WQUPC(int N) {
id = new int[N];
sz = new int[N];
for (int i = 0; i < N; i++) {
id[i] = i;
sz[i] = 1;
}
}
int root(int i) {
while (i != id[i]) {
id[i] = id[id[i]];
i = id[i];
}
return i;
}
boolean connected(int p, int q) { return root(p) == root(q); }
void union(int p, int q) {
int i = root(p);
int j = root(q);
if (sz[i] < sz[j]) {
id[i] = j;
sz[j] += sz[i];
} else {
id[j] = i;
sz[i] += sz[j];
}
}
}
但就像网站提到它的性能一样:
定理:从一个空数据结构开始,对 N 个对象的任何 M 个 union 和 find 操作序列都需要 O(N + M lg* N) 时间。
• 证明非常困难。
• 但算法仍然很简单!
但是我还是很好奇迭代对数lg*n是怎么来的。它是如何派生的?有人可以证明它还是以直观的方式解释它?