/**
*优化方法二:快速union,慢find
*方法一合并时,需要将p元素集合中所有元素都合并到q集合中,效率为O(n)
*现只需将p元素所属集合中根节点所在的元素和q合并即可,构成一棵树,O(1)
*每个元素均有自己的父节点,根节点才是最终元素所属的集合
*合并时,将两个元素的根节点合并
*/
public class UnionFind2 {
private int count;
private int[]parent;
public UnionFind2(int n) {
count=n;
parent=new int[n];
//初始化时,数组中的元素均指向自己,以自己为父节点
for(int i=0;i<count;i++) {
parent[i]=i;
}
}
//不断寻找根节点即元素p所属集合
int find(int p) {
//p不能越界
if(p<0||p>=count)
return -1;
//如果元素p不是自己的本身的父节点,则p存在根节点,根节点即为p所属的最终集合
while(p!=parent[p]) {
p=parent[p];
}
return p;
}
boolean isConnected(int p,int q) {
return find(p)==find(q);
}