並查集(union & find)是一種樹形數據結構,用於處理不交集的查找和合並。數組
find:肯定元素屬於哪一個子集;判斷兩個元素是否屬於同一個子集。數據結構
union:合併兩個子集。優化
拆分複雜,一般不支持也不經常使用拆分。ui
幫派識別spa
數組code
public class QuickUnionUF {
private int[] roots;
public QuickUnionUF(int N) {
roots = new int[N];
for (int i = 0; i < N; i++) {
roots[i] = i;
}
}
}
複製代碼
roots[i] = i 表示節點上級爲本身it
僞代碼以下io
function MakeSet(x) x.root := x function Find(x) if x.root := x return x else return Find(x.root) function Union(x, y) xRoot := Find(x)
yRoot := Find(y)
xRoot.root = yRoot
複製代碼
function MakeSet(x) x.root := x
x.rank := 0
function Union(x, y) xRoot := Find(x)
yRoot := Find(y)
if yRoot.rank > xRoot.rank
xRoot.root := yRoot
else if yRoot.rank < xRoot.rank
yRoot.root := xRoot
else
xRoot.root := yRoot
yRoot.rank := yRoot.rank + 1
複製代碼
public int Find(int x) {
int root = x;
while (root != roots[root]) root = roots[root];
while (x != roots[x]) {
int tmp = roots[x];roots[x] = root;x = tmp;
}
return root;
}
複製代碼