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; } } }
更优化的路径压缩将一棵树压缩成只有两层,所有子节点只有一个根节点,这样在查找根节点或合并时能更快。
相关文章推荐
- rabbitmq 工作队列(java 实现)
- 【Java】线程wait() notify()通信 实现生产者 消费者问题
- 机器学习与数据挖掘-K最近邻(KNN)算法的实现(java和python版)
- java JNI 实现原理 (三) JNI中的RegisterNatives方法
- Java 多线程的两种实现方式
- Java如何实现文件拷贝操作和如何正确关闭资源
- java Swing mysql实现简单的购物系统项目源码
- app及Java服务端实现JT808协议的定义解析
- java实现端口扫描
- 插入排序算法的Java实现
- 算法Java实现--贪心算法--活动安排问题
- 冒泡排序--Java实现
- 详解直接插入排序算法与相关的Java版代码实现
- java语言递归实现快速排序
- 一致性哈希算法学习及JAVA代码实现分析
- 迪杰斯特拉(Dijkstra)算法 Java实现
- Base64编码与解码的java实现
- Java实现多文件压缩打包的方法
- javaSE_8系列博客——Java语言的特性(五)--接口和继承(3)--实现接口
- 利用JAVA类实现九九乘法口诀