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

数据结构之并查集(Union-Find)

并查集Union-Find详解1. 引言并查集Union-Find是一种高效的数据结构主要用于解决动态连通性问题。它能够快速地判断两个元素是否属于同一个集合以及将两个不同的集合合并成一个集合。并查集在图论、网络连接、最小生成树算法如Kruskal算法等领域有广泛应用。2. 基本概念2.1 定义并查集维护一个集合的划分支持两种基本操作Find(x)查找元素x所在的集合或称为查找x的根节点Union(x, y)将包含x和y的两个集合合并2.2 核心思想并查集通过树形结构来表示集合每个集合由一棵树表示树中的每个节点指向其父节点。根节点是集合的代表元素用于标识整个集合。3. 基础实现3.1 数组实现最简单的实现方式是使用数组来存储父节点信息classUnionFind:def__init__(self,n):self.parentlist(range(n))# 初始化每个元素的父节点为自己deffind(self,x):# 基础查找递归查找根节点ifself.parent[x]!x:returnself.find(self.parent[x])returnxdefunion(self,x,y):# 基础合并将y的根节点指向x的根节点root_xself.find(x)root_yself.find(y)ifroot_x!root_y:self.parent[root_y]root_x3.2 时间复杂度分析基础实现的并查集在最坏情况下时间复杂度为O(n)因为可能需要遍历整个树来找到根节点。4. 优化技术4.1 路径压缩Path Compression路径压缩是在查找过程中将路径上的所有节点直接指向根节点从而减少后续查找的时间deffind(self,x):ifself.parent[x]!x:self.parent[x]self.find(self.parent[x])# 递归查找并压缩路径returnself.parent[x]4.2 按秩合并Union by Rank按秩合并是在合并时将较矮的树合并到较高的树下保持树的高度较小def__init__(self,n):self.parentlist(range(n))self.rank[0]*n# 记录每个树的高度defunion(self,x,y):root_xself.find(x)root_yself.find(y)ifroot_xroot_y:return# 按秩合并将秩较小的树合并到秩较大的树下ifself.rank[root_x]self.rank[root_y]:self.parent[root_x]root_yelifself.rank[root_x]self.rank[root_y]:self.parent[root_y]root_xelse:self.parent[root_y]root_x self.rank[root_x]14.3 按大小合并Union by Size另一种优化方式是按集合大小合并将较小的集合合并到较大的集合下def__init__(self,n):self.parentlist(range(n))self.size[1]*n# 记录每个集合的大小defunion(self,x,y):root_xself.find(x)root_yself.find(y)ifroot_xroot_y:return# 按大小合并将较小的集合合并到较大的集合下ifself.size[root_x]self.size[root_y]:self.parent[root_x]root_y self.size[root_y]self.size[root_x]else:self.parent[root_y]root_x self.size[root_x]self.size[root_y]5. 完整优化实现结合路径压缩和按秩合并的并查集实现classUnionFind:def__init__(self,n):self.parentlist(range(n))self.rank[0]*ndeffind(self,x):ifself.parent[x]!x:self.parent[x]self.find(self.parent[x])# 路径压缩returnself.parent[x]defunion(self,x,y):root_xself.find(x)root_yself.find(y)ifroot_xroot_y:returnFalse# 已经在同一集合中# 按秩合并ifself.rank[root_x]self.rank[root_y]:self.parent[root_x]root_yelifself.rank[root_x]self.rank[root_y]:self.parent[root_y]root_xelse:self.parent[root_y]root_x self.rank[root_x]1returnTruedefconnected(self,x,y):returnself.find(x)self.find(y)6. 时间复杂度分析经过优化的并查集具有接近常数时间的操作Find操作O(α(n))其中α是反阿克曼函数增长极其缓慢Union操作O(α(n))Connected操作O(α(n))对于实际应用中的n值α(n)通常小于5因此可以认为这些操作的时间复杂度接近O(1)。7. 应用场景7.1 图的连通性判断判断无向图中两个节点是否连通defis_connected(graph,n):ufUnionFind(n)foru,vingraph.edges:uf.union(u,v)returnuf.connected(start_node,end_node)7.2 最小生成树Kruskal算法Kruskal算法使用并查集来检测添加边时是否形成环defkruskal_mst(edges,n):ufUnionFind(n)mst[]edges.sort(keylambdax:x[2])# 按权重排序foru,v,weightinedges:ifuf.union(u,v):mst.append((u,v,weight))returnmst7.3 网络连接问题模拟网络中节点的连接和断开classNetwork:def__init__(self,n):self.ufUnionFind(n)defconnect(self,a,b):self.uf.union(a,b)defquery(self,a,b):returnself.uf.connected(a,b)7.4 等价类问题处理等价关系将具有相同性质的元素分组deffind_equivalence_classes(elements,relations):ufUnionFind(len(elements))fora,binrelations:uf.union(a,b)# 获取每个元素的根节点作为等价类的标识classes{}foriinrange(len(elements)):rootuf.find(i)ifrootnotinclasses:classes[root][]classes[root].append(elements[i])returnlist(classes.values())8. 扩展功能8.1 路径统计扩展并查集以支持路径统计classUnionFindWithPathCount:def__init__(self,n):self.parentlist(range(n))self.rank[0]*n self.path_count[1]*n# 每个集合的节点数deffind(self,x):ifself.parent[x]!x:self.parent[x]self.find(self.parent[x])returnself.parent[x]defunion(self,x,y):root_xself.find(x)root_yself.find(y)ifroot_xroot_y:returnFalseifself.rank[root_x]self.rank[root_y]:self.parent[root_x]root_y self.path_count[root_y]self.path_count[root_x]elifself.rank[root_x]self.rank[root_y]:self.parent[root_y]root_x self.path_count[root_x]self.path_count[root_y]else:self.parent[root_y]root_x self.rank[root_x]1self.path_count[root_x]self.path_count[root_y]returnTruedefget_size(self,x):returnself.path_count[self.find(x)]8.2 动态连通性支持动态添加节点和边的并查集classDynamicUnionFind:def__init__(self):self.parent{}self.rank{}defadd(self,x):ifxnotinself.parent:self.parent[x]x self.rank[x]0deffind(self,x):ifself.parent[x]!x:self.parent[x]self.find(self.parent[x])returnself.parent[x]defunion(self,x,y):self.add(x)self.add(y)root_xself.find(x)root_yself.find(y)ifroot_xroot_y:returnFalseifself.rank[root_x]self.rank[root_y]:self.parent[root_x]root_yelifself.rank[root_x]self.rank[root_y]:self.parent[root_y]root_xelse:self.parent[root_y]root_x self.rank[root_x]1returnTrue9. 性能对比实现方式Find时间Union时间空间复杂度基础实现O(n)O(n)O(n)路径压缩O(α(n))O(α(n))O(n)按秩合并O(α(n))O(α(n))O(n)完整优化O(α(n))O(α(n))O(n)10. 优缺点分析10.1 优点高效性经过优化的并查集操作接近常数时间简单性实现相对简单易于理解和维护灵活性可以轻松扩展以支持更多功能空间效率只需要O(n)的额外空间10.2 缺点不支持分割操作无法将一个集合分割成两个集合路径压缩可能增加递归深度在极端情况下可能导致栈溢出不适用于需要快速查找所有元素的操作需要遍历整个集合11. 实际应用案例11.1 社交网络分析classSocialNetwork:def__init__(self,n):self.ufUnionFind(n)defadd_friendship(self,a,b):self.uf.union(a,b)defare_friends(self,a,b):returnself.uf.connected(a,b)defget_connected_components(self):components{}foriinrange(self.uf.parent):rootself.uf.find(i)ifrootnotincomponents:components[root][]components[root].append(i)returnlist(components.values())11.2 图的连通分量统计defcount_connected_components(graph,n):ufUnionFind(n)foru,vingraph.edges:uf.union(u,v)# 统计不同的根节点数量rootsset()foriinrange(n):roots.add(uf.find(i))returnlen(roots)12. 总结并查集是一种非常实用的数据结构特别适合处理动态连通性问题。通过路径压缩和按秩合并等优化技术它能够在几乎常数时间内完成查找和合并操作。在实际应用中并查集被广泛应用于图算法、网络分析、等价类划分等领域。选择并查集时需要考虑问题是否涉及动态连通性是否需要高效的查找和合并操作是否可以接受不支持分割操作的限制

相关文章:

数据结构之并查集(Union-Find)

并查集(Union-Find)详解 1. 引言 并查集(Union-Find)是一种高效的数据结构,主要用于解决动态连通性问题。它能够快速地判断两个元素是否属于同一个集合,以及将两个不同的集合合并成一个集合。并查集在图论、…...

避坑指南:TCGA生存分析中,你的基因表达分组用对了吗?(cutoff vs. median vs. quartile)

TCGA生存分析中的基因表达分组策略:从方法论到实战避坑指南 当我们面对TCGA数据库中海量的基因表达数据时,如何将连续的表达量转化为可靠的分组变量,往往决定了生存分析结果的科学性和可重复性。许多研究者会惊讶地发现,同一个基因…...

ONNX Runtime性能优化:InferenceSession.run函数的高效使用技巧

1. ONNX Runtime与InferenceSession.run函数基础 ONNX Runtime是一个高性能的推理引擎,专门用于部署ONNX格式的机器学习模型。在实际应用中,模型的推理性能往往直接影响整个系统的响应速度和资源利用率。而InferenceSession.run函数正是这个过程中的核心…...

3步掌握TIDAL无损音乐下载:打造个人高品质音乐库的智能助手

3步掌握TIDAL无损音乐下载:打造个人高品质音乐库的智能助手 【免费下载链接】tidal-dl-ng TIDAL Media Downloader Next Generation! Up to HiRes / TIDAL MAX 24-bit, 192 kHz. 项目地址: https://gitcode.com/gh_mirrors/ti/tidal-dl-ng 还在为无法离线保存…...

闲鱼AI客服终极指南:7×24小时自动化值守完整教程

闲鱼AI客服终极指南:724小时自动化值守完整教程 【免费下载链接】XianyuAutoAgent 智能闲鱼客服机器人系统:专为闲鱼平台打造的AI值守解决方案,实现闲鱼平台724小时自动化值守,支持多专家协同决策、智能议价和上下文感知对话。 …...

别再假努力!应届生面试高效准备路线图

文章目录前言一、为什么你总在"假努力"?1. 简历上的"垃圾回收站"2. 八股文死记硬背3. 项目介绍像流水账二、真高效准备路线图阶段一:简历极简主义(3天)阶段二:项目深挖与"埋雷"&#xf…...

2026届最火的六大降AI率网站实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 想要把AI生成内容被检测出来的可能性降低,得从好多方面着手,重点留意…...

破局资源获取困境:猫抓浏览器扩展全攻略

破局资源获取困境:猫抓浏览器扩展全攻略 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化时代,网络媒体资源已成为我…...

【新手必看】鼎利测试软件Pilot Pioneer-② 工具栏与菜单栏功能详解

1. Pilot Pioneer工具栏全解析 刚接触鼎利测试软件Pilot Pioneer时,最让我头疼的就是密密麻麻的工具栏图标。但用久了才发现,这些看似复杂的按钮其实是提升效率的"快捷键"。先说说最上方的自定义快速访问工具栏,这个区域就像手机桌…...

Pixel Aurora Engine精彩案例分享:复古游戏封面与角色立绘生成实录

Pixel Aurora Engine精彩案例分享:复古游戏封面与角色立绘生成实录 1. 像素艺术的数字复兴 在数字艺术领域,像素风格正经历着令人振奋的复兴。Pixel Aurora Engine作为这一浪潮中的创新工具,将传统像素艺术与现代AI技术完美融合&#xff0c…...

实战指南:基于快马平台开发在线教育vc16188视频交互系统

实战指南:基于快马平台开发在线教育vc16188视频交互系统 最近在做一个在线教育项目,需要实现视频课程的智能分段和交互功能。经过一番摸索,发现用InsCode(快马)平台可以快速搭建这样一个系统。下面分享下我的实战经验。 系统架构设计 前端部…...

全球工业不间断电源行业市场规模与增长预测

工业不间断电源(简称工业UPS),专为严苛工业环境而设计,在复杂工业环境下为关键负荷提供高可靠性、高稳定性、强抗干扰能力的电力保护专。它的核心功能是在市电发生波动、短时断电或其他电力异常情况下,为关键设备提供持续、稳定的…...

DC-DC移相全桥MATLAB仿真 DC- DC移相全桥电路 移相全桥DC-DC变换器matlab_simulink仿真,功率管采用mosfet,副边接整流电路。 采用PWM控制

DC-DC移相全桥MATLAB仿真 DC- DC移相全桥电路 移相全桥DC-DC变换器matlab/simulink仿真,功率管采用mosfet,副边接整流电路。 采用PWM控制; 输出稳定且可调,可稳定输出电压你想要的值 matlab 编辑 1function create_PSFB_Model(…...

3DS游戏格式转换指南:用3dsconv轻松实现CCI到CIA的完美转换

3DS游戏格式转换指南:用3dsconv轻松实现CCI到CIA的完美转换 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 还在…...

Objects365数据集太大?用Python脚本精准提取你需要的类别并转成YOLO格式

高效处理Objects365数据集:Python实战指南精准提取目标类别并转换YOLO格式 当面对像Objects365这样包含365个类别、数据量庞大的数据集时,很多开发者会遇到一个共同难题:如何快速提取自己需要的少数几个类别,而不必下载和处理整个…...

OpCore-Simplify:重构OpenCore EFI配置的效率革命工具

OpCore-Simplify:重构OpenCore EFI配置的效率革命工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 行业痛点分析:黑苹果配置…...

biliup问题速解指南:从现象到根源的系统排查方法论

biliup问题速解指南:从现象到根源的系统排查方法论 【免费下载链接】biliup 自动直播录制、投稿、twitch、ytb频道搬运工具。命令行投稿(B站)和视频下载工具,提供多种登录方式,支持多p。 项目地址: https://gitcode.com/gh_mirrors/bi/bili…...

【Git 内部原理】`.git` 是怎么记住所有版本的

​ 每次 git commit,Git 都说"已记录"。但你有没有想过:改了几十次、几百次,Git 是怎么全记住的?难道每次提交,它都复制一份完整项目? ​ 这篇文章不讲命令,也不背概念。 我们直接打开…...

YOLOv8实战:如何用Python脚本批量预测验证码并提升识别准确率?

YOLOv8实战:Python脚本批量预测验证码与准确率优化指南 验证码识别一直是计算机视觉领域的经典挑战。传统方法依赖复杂的图像预处理和模板匹配,而基于YOLOv8的解决方案通过端到端训练实现了质的飞跃。本文将手把手带你实现从模型部署到批量预测的全流程&…...

YOLOv11的PTQ(训练后静态量化)实战:从浮点到整型的性能突围

一、深夜的显存告警 上周三凌晨两点,手机突然连续震动——生产环境服务器显存超限告警。跑到监控面板一看,部署的YOLOv11模型在峰值请求时段显存占用直接飙到8G以上,导致相邻服务被OOM Killer强制终止。这已经是本月第三次了。浮点模型在边缘…...

Pixel Language Portal效果实测:Hunyuan-MT-7B在游戏对话文本中的语气保留与文化适配能力

Pixel Language Portal效果实测:Hunyuan-MT-7B在游戏对话文本中的语气保留与文化适配能力 1. 引言:当翻译遇见像素冒险 在游戏本地化领域,传统翻译工具往往难以捕捉角色对话中的独特语气和文化内涵。Pixel Language Portal(像素…...

QuickBMS游戏资源提取指南:从逆向工程到模组制作的全能工具

QuickBMS游戏资源提取指南:从逆向工程到模组制作的全能工具 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS QuickBMS是一款功能强大的跨平台游戏资源提取工具,通过简单的…...

OpenClaw定时任务实战:gemma-3-12b-it每日凌晨自动备份重要文件

OpenClaw定时任务实战:gemma-3-12b-it每日凌晨自动备份重要文件 1. 为什么需要自动化文件备份 上周我的移动硬盘突然罢工,导致三个月的工作文档险些丢失。这次事故让我意识到:人工备份永远存在疏漏。即使设置了日历提醒,也难免因…...

DAMO-YOLO新手教程:调节置信度阈值,让AI识别更精准

DAMO-YOLO新手教程:调节置信度阈值,让AI识别更精准 1. 认识置信度阈值:AI识别的"严格程度" 当你使用DAMO-YOLO系统时,可能会发现有些物体被识别出来了,有些却没有。这背后有一个关键参数在起作用——置信度…...

Python+百度OCR实战:5分钟搞定批量图片经纬度提取(附完整代码)

Python百度OCR实战:5分钟搞定批量图片经纬度提取(附完整代码) 当你面对数百张带有经纬度水印的野外考察照片时,是否曾为手动记录坐标而抓狂?去年参与某生态调查项目时,团队摄影师每天传回300张带坐标水印的…...

AI辅助开yun架构设计:让快马平台智能生成弹性可扩展的服务代码

在云原生架构设计中,弹性伸缩和容错能力是应对高并发场景的核心需求。最近我在设计一个秒杀系统的商品查询服务时,深刻体会到AI辅助开发带来的效率提升。下面分享如何通过智能工具快速实现关键功能模块。 业务逻辑接口设计要点 商品查询服务作为秒杀系统…...

当LabVIEW遇见AI:使用快马平台集成机器学习实现数据趋势预测

当LabVIEW遇见AI:使用快马平台集成机器学习实现数据趋势预测 最近在做一个工业设备状态监测的项目,需要实时预测电机振动趋势。传统LabVIEW开发虽然擅长数据采集和可视化,但加入AI预测能力一直让我头疼。直到尝试了InsCode(快马)平台&#x…...

实战起步:基于快马ai生成集成openclaw的windows自动化监控项目脚手架

实战起步:基于快马AI生成集成OpenClaw的Windows自动化监控项目脚手架 最近在做一个网络资源监控的小项目,需要在Windows环境下使用OpenClaw工具。作为一个经常被环境配置折磨的开发者,这次尝试用InsCode(快马)平台来生成完整的项目脚手架&am…...

MATLAB科研绘图:如何用title/legend/grid on让你的论文图表通过审稿人‘火眼金睛’?

MATLAB科研绘图:学术图表标注的审稿人级优化指南 科研图表是论文的"门面",审稿人往往在30秒内就能通过图表质量判断研究的严谨性。我曾参与多个顶级期刊的图表评审工作,发现90%的退稿图表问题都出在标注细节上——不是数据不好&…...

高效办公:浏览器扩展无需安装桌面软件的全功能解决方案

高效办公:浏览器扩展无需安装桌面软件的全功能解决方案 【免费下载链接】se-office se-office扩展,提供基于开放标准的全功能办公生产力套件,基于浏览器预览和编辑office。 项目地址: https://gitcode.com/gh_mirrors/se/se-office 在…...