存在「具有路徑壓縮的加權快速聯合」算法。具有路徑壓縮算法的加權快速聯合
代碼:
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章,很好的解釋。 – rendon