算法 - 并查集(Java)
并查集由 Bernard A.Galler 和 Michael J.Fischer 于1964年提出,是一种树形的数据结构,适合处理关系相关的问题,并查集主要有2种操作:
- 合并两个集合
- 判断两个元素是否属于一个集合。
并查集的代码实现如下(Java):
class UnionFindSet {
private int[] roots;
private int[] rank;
public UnionFindSet(int n) {
roots = new int[n];
rank = new int[n];
for (int i = 0; i < n; i++) {
roots[i] = i;
}
}
// 查 - 非路径压缩
private int ordinaryFind(int i) {
while (roots[i] != i) {
i = roots[i];
}
return i;
}
// 查 - 路径压缩
private int find(int i) {
return roots[i] == i ? i : (roots[i] = find(root[i]));
}
// 判断是否在同一集合
private boolean isInOneSet(int i, int j) {
return find(i) == find(j);
}
// 普通合并
private void union(int i, int j) {
int fi = find(i);
int fj = find(j);
if (fi != fj) {
roots[fi] = fj;
}
}
// 按秩合并
private void rankUnion(int i, int j) {
int fi = find(i);
int fj = find(j);
if (rank[fi] > rank[fj]) {
roots[fj] = fi;
} else {
roots[fi] = fj;
if (rank[fi] = rank[fj]) {
rank[fj]++;
}
}
}
}