当前位置: 首页 > news >正文

并查集示例

并查集 =“合并(Union)+ 查找(Find)”的集合,也叫Disjoint Set Union(DSU)

它只做两件极快的事:

  1. Find(x)– 问“x 在哪个集合?”→ 返回根节点
  2. Union(x, y)– 把 x 所在集合与 y 所在集合合并成一个大集合

复杂度
经过“路径压缩 + 按秩/大小合并”,单次操作平均O(α(n)),α 是反阿克曼函数,比 log n 还慢,但常数 < 5,可当作常数时间

经典场景是任何需要“不断把元素合并、不断问是否同组”的问题。一句话,并查集就是“专门高效处理动态分组与连通查询”的最简数据结构。

例题

有若干个category:(1, 2), (2, 3), (4, 3), (5, 6), (6, 7, 10, 11)。
程序处理后需要输出这样的结果:(1, 2, 3, 4),(5, 6, 7, 10, 11)。

importjava.util.*;publicclassMergeCategories{publicstaticvoidmain(String[]args){List<List<Integer>>input=Arrays.asList(Arrays.asList(1,2),Arrays.asList(2,3),Arrays.asList(4,3),Arrays.asList(5,6),Arrays.asList(6,7,10,11));List<Set<Integer>>merged=merge(input);for(Set<Integer>group:merged){System.out.println(group);}}privatestaticList<Set<Integer>>merge(List<List<Integer>>input){UnionFinduf=newUnionFind();for(List<Integer>list:input){if(list.isEmpty()){continue;}intfirst=list.get(0);for(intele:list){uf.union(first,ele);}}// 按根分组Map<Integer,Set<Integer>>groups=newHashMap<>();for(intx:uf.parent.keySet()){introot=uf.find(x);groups.computeIfAbsent(root,k->newLinkedHashSet<>()).add(x);}returnnewArrayList<>(groups.values());}// 并查集staticclassUnionFind{Map<Integer,Integer>parent=newHashMap<>();// 递归intfind(intx){intp=parent.computeIfAbsent(x,k->k);if(p!=x){parent.put(x,find(p));p=parent.get(x);}returnp;}voidunion(intx,inty){introotX=find(x);introotY=find(y);if(rootX!=rootY){parent.put(rootX,rootY);}}}}
http://www.jsqmd.com/news/95923/

相关文章:

  • OpenWrt磁盘管理终极指南:luci-app-diskman完整使用教程
  • PlayCover深度解析:在Apple Silicon Mac上运行iOS游戏的技术实践
  • Flutter 状态管理终极指南(2025 版):从 setState 到 Riverpod 3.0,如何做出正确选择?
  • 让程序帮孩子更好的认识这个世界
  • 夸克网盘自动化签到终极指南:一键配置稳定运行
  • 如何接口封装 注意事项
  • 与 Teigha的相爱相杀
  • Laravel 13重大升级揭秘:多模态事件监听带来的5倍性能提升可能?
  • 38、时间处理函数的全面解析与应用
  • SGP4卫星轨道计算终极指南:从入门到实战的完整解决方案
  • 39、深入探讨 Linux 系统中的睡眠与计时机制
  • 终极Windows显示器亮度管理:Twinkle Tray完整解决方案
  • 动环监控系统是什么?主要包括哪些功能与优势?
  • Android权限管理的架构革命:XXPermissions框架深度设计与实战解析
  • 26、Linux网络防御与安全配置全解析
  • 告别网页束缚:BaiduPCS-Go让百度网盘操作飞起来
  • 27、Linux网络防御、内核及模块管理全解析
  • 40、GCC对C语言的扩展:提升编程效率与性能
  • 21、网络服务基础:FTP、Sendmail与DNS详解
  • 图像转立体浮雕:5步实现3D建模自动化
  • 22、BIND 服务器配置、使用与安全全解析
  • 23、深入了解SAMBA与Linux网络监控
  • 终极游戏自动化:智能助手带你体验全新的游戏解放方案
  • 24、Linux网络工具与安全协议详解
  • FP8量化技术详解:为何Stable Diffusion 3.5更轻更快?
  • 3个步骤掌握Koodo Reader:打造你的专属移动图书馆
  • ImageToSTL终极教程:5分钟将普通图片变成立体3D模型
  • OpenCore Legacy Patcher:让旧款Mac重获新生的终极指南
  • PHP处理医疗数据导出的3大陷阱(90%开发者都踩过坑)
  • 缓存命中率低?Symfony 8五大陷阱你中了几个,