当前位置: 首页 > 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.cnnetsun.cn/news/74287.html

相关文章:

  • 百度网盘秒传脚本完全指南:快速上手极速生成功能
  • 芯片价格战:成本才是王道
  • layerdivider:AI图像分层革命,让设计效率飙升10倍
  • 收到工资1002415.13元,爱你华为。
  • Windows 11精简终极教程:三步打造高性能轻量系统
  • 全面解锁Honey Select 2游戏潜能的200+插件整合方案
  • ComfyUI与ONNX Runtime集成:跨框架模型支持
  • WebSite-Downloader 网站下载器终极指南:5分钟快速上手完整教程
  • 什么是公有云
  • PHP 8.6错误码实战手册:从E_ERROR到自定义Throwable的全面掌控
  • 解决Tiled地图编辑器中图层管理混乱的终极方案
  • 20、网络服务器安全与配置指南
  • 21、网络服务基础:FTP、Sendmail与DNS详解
  • B站视频下载终极指南:BiliDownloader完整使用教程
  • 悄悄收藏!这套免费资源包,让你在思维、职场、育儿赛道上同时超车
  • 揭秘R-Python变量传递难题:5种高效解决方案让你少走3年弯路
  • OpenCore Legacy Patcher:让旧款Mac重获新生的终极指南
  • FP8量化技术详解:为何Stable Diffusion 3.5更轻更快?
  • 使用Wan2.2-T2V-5B生成广告短视频模板的完整工作流
  • 揭秘医疗数据导出难题:PHP如何实现安全合规的CSV与JSON转换
  • 【GraphQL的PHP错误处理】:掌握5种高效异常捕获策略,提升API健壮性
  • 独家披露:顶级金融机构都在用的R语言Copula风险建模内部笔记(限时公开)
  • ImageToSTL:零基础将图片秒变3D打印模型的神器
  • 口语教育的黄金时代:AI技术引领教育创新与创业机遇
  • 基于多模态大模型的工业质检系统:从AOI到“零样本“缺陷识别的产线实践
  • 微信视频号直播弹幕抓取终极指南:实时获取互动数据的完整方案
  • Source Han Serif 思源宋体:开源专业字体全方位应用指南
  • 医疗数据交换新标准来了,PHP如何快速支持FHIR格式导出?
  • 移动端PDF预览困境:如何用pdfh5.js打造丝滑体验
  • 5分钟搞定Windows虚拟显示器:零基础也能轻松上手