您的位置:首页 > 编程语言 > Java开发

java实现并查集算法

2017-07-13 21:43 169 查看

并查集

并查集是一种树型的数据结构,用于处理一些不相交集合(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
;
this.rank=new int
;
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;
}

}

}


更优化的路径压缩将一棵树压缩成只有两层,所有子节点只有一个根节点,这样在查找根节点或合并时能更快。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息