【发布时间】:2017-05-26 16:56:34
【问题描述】:
有一个“带路径压缩的加权快速联合”算法。
代码:
public class WeightedQU
{
private int[] id;
private int[] iz;
public WeightedQU(int N)
{
id = new int[N];
iz = new int[N];
for(int i = 0; i < id.length; i++)
{
iz[i] = i;
id[i] = i;
}
}
public int root(int i)
{
while(i != id[i])
{
id[i] = id[id[i]]; // this line represents "path compression"
i = id[i];
}
return i;
}
public boolean connected(int p, int q)
{
return root(p) == root(q);
}
public void union(int p, int q) // here iz[] is used to "weighting"
{
int i = root(p);
int j = root(q);
if(iz[i] < iz[j])
{
id[i] = j;
iz[j] += iz[i];
}
else
{
id[j] = i;
iz[i] += iz[j];
}
}
}
问题:
路径压缩如何工作?
id[i] = id[id[i]]表示我们只到达节点的第二个祖先,而不是根。iz[]包含从0到N-1的整数。iz[]如何帮助我们了解集合中的元素数量?
有人可以帮我澄清一下吗?
【问题讨论】:
-
阅读 c/c++ 中的算法,第 1-4 部分,robert sedgewick,第 1 章,很好的解释。
标签: java algorithm union-find