news 2026/7/26 21:03:58

并查集示例

作者头像

张小明

前端开发工程师

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/7/24 20:13:20

25、Pthreads 多线程编程全面解析

Pthreads 多线程编程全面解析 1. 线程同步规则与 Pthreads 概述 在多线程编程中,为了避免死锁等问题,需要明确的规则。例如,必须始终先获取互斥锁 A 再获取互斥锁 B。随着程序复杂度和同步需求的增加,执行这些规则会变得更加困难,因此应尽早开始并进行清晰的设计。 Lin…

作者头像 李华
网站建设 2026/7/26 1:56:50

31、Linux动态内存分配与管理全解析

Linux动态内存分配与管理全解析 1. 动态内存分配概述 在程序运行过程中,动态内存分配起着至关重要的作用。与自动变量和静态变量不同,动态内存是在运行时进行分配的,其大小在分配之前可能是未知的。当程序需要存储文件内容或处理用户输入时,由于其大小不确定,就需要动态…

作者头像 李华
网站建设 2026/7/26 17:19:47

38、时间处理函数的全面解析与应用

时间处理函数的全面解析与应用 1. 时间获取函数 1.1 time() 函数 time() 函数返回自纪元(epoch)以来经过的秒数,以此表示当前时间。如果参数 t 不为 NULL ,该函数还会将当前时间写入该指针。出现错误时,函数返回 -1(转换为 time_t 类型),并适当地设置 errno…

作者头像 李华
网站建设 2026/7/26 19:13:15

Laravel 13重大升级揭秘:多模态事件监听带来的5倍性能提升可能?

第一章&#xff1a;Laravel 13重大升级概览Laravel 13 带来了多项底层架构优化与开发者体验提升&#xff0c;进一步巩固其作为现代PHP框架领先地位。本次升级聚焦于性能增强、开发流程简化以及对最新PHP生态的深度集成。核心架构改进 框架底层对服务容器和门面系统进行了重构&a…

作者头像 李华
网站建设 2026/7/24 8:14:37

Symfony 8缓存配置全解析:从入门到生产环境优化

第一章&#xff1a;Symfony 8 缓存机制概述Symfony 8 提供了一套强大且灵活的缓存系统&#xff0c;旨在提升应用性能并降低重复计算开销。该机制不仅支持多种缓存适配器&#xff0c;还深度集成于框架核心组件中&#xff0c;如路由、模板、服务容器等&#xff0c;自动优化运行效…

作者头像 李华