java实现并查集算法

来源:互联网 发布:java开源网 编辑:程序博客网 时间:2024/05/24 01:29

并查集

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


更优化的路径压缩将一棵树压缩成只有两层,所有子节点只有一个根节点,这样在查找根节点或合并时能更快。

原创粉丝点击