news 2026/9/3 3:04:00

并查集示例

作者头像

张小明

前端开发工程师

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/9/2 21:37:36

21、Linux系统中的高级进程管理

Linux系统中的高级进程管理 1. I/O优先级 在Linux系统中,除了调度优先级之外,进程还可以指定I/O优先级。这个值会影响进程I/O请求的相对优先级,内核的I/O调度器会优先处理来自I/O优先级较高的进程的请求。 默认情况下,I/O调度器使用进程的 nice 值来确定I/O优先级,因…

作者头像 李华
网站建设 2026/9/2 21:37:28

22、实时系统与资源限制相关技术解析

实时系统与资源限制相关技术解析 1. 实时调度策略设置 在实时系统中,调度策略的设置至关重要。可以使用 sched_setscheduler() 函数将调用进程的调度策略设置为具有静态优先级的轮询调度(Round-Robin)。示例代码如下: struct sched_param sp = { .sched_priority = 1…

作者头像 李华
网站建设 2026/9/2 22:28:39

Beyond Compare 5终极激活方案:本地生成永久授权密钥

Beyond Compare 5终极激活方案&#xff1a;本地生成永久授权密钥 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 作为文件对比和代码审查的专业工具&#xff0c;Beyond Compare 5的功能确实令人…

作者头像 李华
网站建设 2026/9/2 13:09:10

3分钟获取Beyond Compare 5永久授权的终极指南

3分钟获取Beyond Compare 5永久授权的终极指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 还在为Beyond Compare 5的授权限制而困扰吗&#xff1f;这款被誉为文件对比神器的软件&#xff0c…

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

34、Linux 内存管理与信号机制详解

Linux 内存管理与信号机制详解 1. 内存锁定对系统性能的影响 改变内核的分页行为可能会对整体系统性能产生负面影响。当一个应用程序的页面被锁定到内存中时,其确定性或安全性可能会提高,但这会导致另一个应用程序的页面被换出。内核通常会选择最优的页面进行换出,即未来最…

作者头像 李华
网站建设 2026/9/2 22:09:39

35、信号处理基础与实践

信号处理基础与实践 1. 特殊信号介绍 SIGVTALRM :当使用 ITIMER_VIRTUAL 标志创建的定时器到期时, setitimer() 函数会发送此信号。 SIGWINCH :当终端窗口大小改变时,内核会为前台进程组中的所有进程发出此信号。默认情况下,进程会忽略该信号,但如果进程知晓其终…

作者头像 李华