并查集
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并。
主要作用
解决连接问题
如何在上图这样复杂的图中判断两个点是否是相连的,这就是并查集要解决的
类UnionFind
parent[]存储该节点的父亲节点
public class UnionFind {
private int[] parent;
private int count;
private int[] rank; //rank[i]表示以i为根的集合所表示的树的层数
public UnionFind(int n) {
this.parent =new int[n];
this.rank=new int[n];
this.count = n;
for(int i=0;i<n;i++){
parent[i]=i;
rank[i]=1;
}
}
//查找p的根节点
public int find(int p){
assert(p>=0&&p<count);
// while(p!=parent[p]){
// parent[p]=parent[parent[p]]; //路径压缩优化
// p=parent[p];
// }
// return p;
if(p!=parent[p])
parent[p]=find(parent[p]); //更优化的路径压缩
return parent[p];
}
//若p,q的根节点相同则表明他们连接
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[pRoot]=qRoot; //rank[qRoot]不用更新
}else if(rank[qRoot]<rank[qRoot]){
parent[qRoot]=pRoot;
}else{
parent[pRoot]=qRoot;
rank[qRoot]+=1;
}
}
}
更优化的路径压缩将一棵树压缩成只有两层,所有子节点只有一个根节点,这样在查找根节点或合并时能更快。