并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高。

笔者采用 jvav 语言演示 并查集结构 时间复杂度O(1) (接近)

//并查集
//判断两个元素是否属于同一集合
//将两个集合连接
//要求时间复杂度O(1)
class UnionFieldSet<V> {HashMap<V, Element> eMap;HashMap<Element, Element> fMap;HashMap<Element, Integer> iMap;public UnionFieldSet(List<V> list) {eMap = new HashMap<>();fMap = new HashMap<>();iMap = new HashMap<>();for (V e : list) {Element<V> E = new Element<>(e);eMap.put(e, E);fMap.put(E, E);iMap.put(E, 1);}}Element getHead(Element<V> e) {Stack<Element<V>> stack = new Stack<>();while (e != fMap.get(e)) {stack.add(e);e = fMap.get(e);}while (!stack.empty()) {fMap.put(stack.pop(), e);}return e;}boolean isSame(V a, V b) {if (!(eMap.containsKey(a) && eMap.containsKey(b))) return false;if (getHead(eMap.get(a)) == getHead(eMap.get(b))) return true;return false;}void union(V a, V b) {if (!(eMap.containsKey(a) && eMap.containsKey(b))) return;Element<V> ah = getHead(eMap.get(a));Element<V> bh = getHead(eMap.get(b));if (ah == bh) return;Element<V> s = iMap.get(ah) < iMap.get(bh) ? ah : bh;Element<V> l = s != eMap.get(ah) ? ah : bh;fMap.put(s, l);iMap.put(l, iMap.get(ah) + iMap.get(bh));iMap.remove(s);}
}

并查集相关接口 

判断两个元素是否属于同一集合 时间复杂度O(1)

boolean isSame(V a, V b)

合并两个元素所在的集合 时间复杂度O(1)

void union(V a, V b)

获取元素e的头元素,并使集合所有元素指向头元素

Element getHead(Element<V> e)

世界线回溯,从jvav到架构师

自学Java day53 使用jvav实现 并查集 数据结构 从jvav到架构师相关推荐

  1. 并查集数据结构的几种实现

    第一种实现 每一个节点都只是指向根节点 find是 常数时间复杂度的, union是 线性时间复杂度的. class quickFind {int[] a;int count;void init (i ...

  2. 自学Java day53 使用jvav实现 字典树 数据结构 从jvav到架构师

    字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公 ...

  3. 自学Java day53 使用jvav实现 BitMap 数据结构 从jvav到架构师

    此BitMap不是指图片存储格式里的位图. Bit即比特,是目前计算机系统里边数据的最小单位,8个bit即为一个Byte.一个bit的值,或者是0,或者是1:也就是说一个bit能存储的最多信息是2. ...

  4. 自学Java day24 一篇文章弄懂mySQL基础命令 从jvav到架构师

    结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统. 本篇采用 m ...

  5. Java实现_算法_并查集

    并查集 作用:用来查找某个图中是否含有闭环. 比如图一: 上图中就是没有闭环的一个图,而下图(图二)就是一个有闭环的图 思路1-数组寻根法: 顾名思义,数组寻根法(自己称呼的)就是寻找每个节点的根节点 ...

  6. Java程序员该如何学习才能成长为一名优秀的架构师

    Java架构师,首先要是一个Java程序员,熟练掌握使用各种框架,并知道它们实现的原理,Java虚拟机原理.调优,懂得JVM能让你写出性能更好的代码,池技术,什么对象池,怎么解决并发量.连接池,线程池 ...

  7. 不认识java代码_程序员进阶:优雅的代码对于一个架构师的重要性

    lison:复旦大学工程硕士,专注技术十年,产品控.代码控,拥有丰富的项目经验,主持研发了多个成功上线的大型互联网项目.热爱互联网,热衷于各种web技术,精通JAVA.J2EE和前端开发,擅长互联网高 ...

  8. java程序员内功_Java程序员如何成为内功深厚的架构师

    一听到架构师,首先便想到的是在一间宽敞的房间中间坐着一位衣着得体的中年男人,望着落地窗外的风景凝思,万千思绪在脑海里翻腾,颇有运筹帷幄千里外的气势.程序员究竟是做架构师还是项目经理,最近看到微软潘正磊 ...

  9. 不停歇的Java即将发布JDK16新特性速览及从菜鸟到架构师[图]

    一.不停歇的Java即将发布JDK16新特性速览 当开发者深陷Java8版本之际,这边下一版本Java16有了最新的消息,与Java15一样,作为短期版本,Oracle仅提供6个月的支持. 根据发布计 ...

最新文章

  1. 函数重载和 函数模板
  2. 清华大学计算机系教授:马少平——计算机是如何实现智能的(附直播回放)...
  3. 再议.Net中null的使用规范
  4. Discuz!X安装配置
  5. Windows Server 2008怎么查看远程桌面登录日志
  6. python读取pcd点云/转numpy(python2+python3,非ROS环境)
  7. 典型的同步客户端、服务器端套接字的创建
  8. redis decr 防止超卖_一文搞定Redis高级特性与性能调优
  9. js 的 protype 小总结
  10. emule学习与分析一 概述
  11. 浅谈php的抽象类和接口类
  12. Windows10易升下载
  13. 华为服务器清除系统密码,华为服务器重置密码
  14. 命令方式查找ip地址、Mac地址
  15. 公共DNS推荐及dns测速
  16. 程序质量:代码静态检查
  17. windows c语言 创建目录,C语言创建删不掉的文件夹
  18. jQuery官网下载文档的步骤
  19. javascript_ES6新特性
  20. C#基础编程——简介及基础语法

热门文章

  1. 如何把语音转换成文字呢?
  2. 【无标题】阿里滑块 通过 x82y接口、dll、源码 返回x5sec,可解决!
  3. 深入理解Linux内核通知链(Notifier)
  4. 网络安全攻击与防护--HTML学习
  5. silverlight mysql_Silverlight中衔接MySQL数据库实例详解
  6. 使用unbound在RHEL7上搭建DNS服务
  7. 深信服技术认证之容灾与备份(一)
  8. ECharts :lable显示所有数据、修改字体样式
  9. html银河特效编码,html5 canvas银河星系动画特效
  10. 海豚湾--纪录日本人如何杀戮海豚的