注意:
union() //union是在判斷2個觸點(sites)不是連通分量的時候 ,要執(zhí)行merge操作
組合的時候有個地方需要注意:
獲取到2個觸點的頂層結(jié)點 pID、qID 把id[pID] = qID (改變的是頂層的結(jié)點)
比如下圖:
p = 5 q = 9 時, id[] = {},
5和9往上找根觸點, 5的根是1(用5↑ 表示),9的是8(用9↑ 表示)
需要把id[p=5↑] = id[9↑] (也就是8也就是find(q))。
總結(jié):
- 頂層的觸點都是值和索引相等
-
每次修改一位
private int[] parent;
private int count;
public QuickUnionUF(int n){
parent = new int[n];
count = n;
for (int i = 0; i < n; i++) {
parent[i] = i;
}
// System.out.println();
}
public int count() {
return count;
}
public int find(int p){
validate(p);
while(p != parent[p]){
//如果p不等parent[p],則存在父節(jié)點(parent[parent[p]])
//直到根節(jié)點 根節(jié)點可以想成一個指向自己的結(jié)點,也就是自環(huán)
p = parent[p];
}
return p;
}
// validate that p is a valid index
private void validate(int p) {
int n = parent.length;
if (p < 0 || p >= n) {
throw new IllegalArgumentException("index " + p + " is not between 0 and " + (n-1));
}
}
public boolean connected(int p, int q){
return find(p) == find(q);
}
public void union(int p, int q){
int rootP = find(p);
int rootQ = find(q);
if(rootP == rootQ){
return;
}
parent[rootP] = rootQ;
count--;
}