基于 size 的优化
package com.dataStructure.union_find;
public class UnionFind3 {
private int[] parent;
private int[] size;
private int count;
public UnionFind3(int n) {
count = n;
parent = new int[count];
size = new int[count];
for (int i = 0; i < count; i++) {
parent[i] = i;
size[i] = 1;
}
}
private int find(int p){
while (p!=parent[p]){
p = parent[p];
}
return p;
}
public boolean isConnected(int p, int q){
return find(p) == find(q);
}
public void unionElements(int p, int q){
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot)
return;
if (size[pRoot] > size[qRoot]){
parent[qRoot] = pRoot;
size[pRoot] += size[qRoot];
}else {
parent[pRoot] = qRoot;
size[qRoot] += size[pRoot];
}
}
}
基于 rank 的优化
package com.dataStructure.union_find;
public class UnionFind4 {
private int[] parent;
private int[] rank;
private int count;
public UnionFind4(int n) {
count = n;
parent = new int[count];
rank = new int[count];
for (int i = 0; i < count; i++) {
parent[i] = i;
rank[i] = 1;
}
}
private int find(int p){
while (p!=parent[p]){
p = parent[p];
}
return p;
}
public boolean isConnected(int p, int q){
return find(p) == find(q);
}
public void unionElements(int p, int q){
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot)
return;
if (rank[pRoot] > rank[qRoot])
parent[qRoot] = pRoot;
else if (rank[pRoot] < rank[qRoot])
parent[pRoot] = qRoot;
else{
parent[pRoot] = qRoot;
rank[qRoot] += 1;
}
}
}