news 2026/6/9 6:37:54

并查集示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
并查集示例

并查集 =“合并(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);}}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 6:25:14

26、线程、文件与目录管理技术解析

线程、文件与目录管理技术解析 线程取款函数分析 下面是一个取款函数的代码: int withdraw (struct account *account, int amount) {pthread_mutex_lock (&account->mutex);const int balance = account->balance;if (balance < amount) {pthread_mutex_unl…

作者头像 李华
网站建设 2026/6/9 16:45:04

30、Linux 文件事件监控与内存管理技术解析

Linux 文件事件监控与内存管理技术解析 1. inotify 实例添加新监控 可以向现有的 inotify 实例添加新的监控。示例代码如下: int wd; wd = inotify_add_watch (fd, "/etc", IN_ACCESS | IN_MODIFY); if (wd == -1) {perror ("inotify_add_watch");exi…

作者头像 李华
网站建设 2026/6/8 20:06:37

R语言Copula应用全解析(金融风险建模核心技术大公开)

第一章&#xff1a;金融风险的 R 语言 Copula 参数估计在金融风险管理中&#xff0c;资产收益之间的依赖结构建模至关重要。传统的线性相关系数无法充分捕捉尾部依赖和非对称关系&#xff0c;而 Copula 模型提供了一种灵活的方法&#xff0c;能够分离边缘分布与联合依赖结构&am…

作者头像 李华
网站建设 2026/6/9 2:02:47

如何快速掌握BaiduPCS-Go:命令行网盘管理的终极指南

如何快速掌握BaiduPCS-Go&#xff1a;命令行网盘管理的终极指南 【免费下载链接】BaiduPCS-Go 项目地址: https://gitcode.com/gh_mirrors/baid/BaiduPCS-Go 想要彻底告别繁琐的网页操作&#xff0c;用命令行高效管理你的百度网盘吗&#xff1f;BaiduPCS-Go作为一款功能…

作者头像 李华
网站建设 2026/6/8 8:59:14

CubiFS酒店数据管理终极指南:构建智能化客户档案系统

CubiFS酒店数据管理终极指南&#xff1a;构建智能化客户档案系统 【免费下载链接】cubefs CubiFS 是一个开源的分布式文件系统&#xff0c;用于数据存储和管理&#xff0c;支持多种数据存储模型和云原生环境。 * 分布式文件系统、数据存储和管理 * 有什么特点&#xff1a;支持多…

作者头像 李华
网站建设 2026/6/6 13:06:18

农业物联网数据可视化全攻略(PHP+传感器集成大揭秘)

第一章&#xff1a;农业物联网数据可视化全攻略&#xff08;PHP传感器集成大揭秘&#xff09;在现代农业中&#xff0c;物联网技术正逐步改变传统耕作方式。通过部署温湿度、土壤水分、光照强度等传感器&#xff0c;并结合PHP后端系统实现数据采集与可视化&#xff0c;农户可以…

作者头像 李华