因为quickfind的合并操作复杂度On,所以现实很少用。
常用的是quickUnion。
同样实现并查集接口。
public class UnionFind2 implements UF {
private int[] parent;
public UnionFind2(int size) {
parent = new int[size];
for (int i = 0; i < size; i++) {
parent[i] = i;
}
}
private int find(int p ){
while (p!=parent[p])
p=parent[p];//不断找根节点
return p;
}
@Override
public int getSize() {
return parent.length;
}
@Override
public Boolean isConnected(int p, int q) {
return find(p)==find(q);
}
@Override
public void unionElements(int p, int q) {
int pRoot = find(p);
int qRoot = find(q);
if (pRoot==qRoot)
return;
parent[pRoot]=qRoot;
}
}
quickunion是基于数组实现的树结构,因为不需要存储数据,基于数组的索引即可很容易实现。和以前的树结构的最大区别是,这个树的子节点指向父节点。
parent[p] = q;//p的父节点是q。
union操作是复杂度是O(h)
h是树的深度。