【算法笔记】并查集详解

🚀 并查集(Union-Find)详解:原理、实现与优化

并查集(Union-Find)是一种非常高效的数据结构,用于处理动态连通性问题,即判断若干个元素是否属于同一个集合,并支持集合合并操作。它在图算法中(如 Kruskal 最小生成树)、朋友圈统计、网络连通性判断等场景中非常常见。

🧠 并查集的核心功能

  • find(x):查找元素 x 所在集合的代表(也叫“根节点”)
  • union(x, y):将元素 xy 所在的两个集合合并
  • parent[x]:记录每个元素的“父亲”,通过父亲链条找祖先(树结构)

🧩 并查集基本结构

n = 5
parents = list(range(n + 1))  # parents[i] = i,0号位不使用

🔍 基本实现:find 和 union

def find(x):if parents[x] == x:return xelse:return find(parents[x])
def union(x, y):root_x = find(x)root_y = find(y)if root_x == root_y:return Falseparents[root_y] = root_xreturn True

🧠 类比记忆

  • 每个元素的 parent 就像是它的“爸爸”
  • find(x) 就是往上找老祖宗
  • union(x, y) 就是两个家族联姻,把一个家族并进另一个

⚡ 并查集优化技巧(路径优化):路径压缩优化

查询时顺便把路径上所有的节点都指向大族长,一次find后这条路径的深度为1

def find(x):if x != parents[x]:parents[x] = find(parents[x])return parents[x]

🧱 并查集优化技巧(合并优化):按秩合并 & 按大小合并

🔢 按大小合并(Union by Size)

小家族归大家族,大的当族长

size = [1] * (n + 1)def union(x, y):rx, ry = find(x), find(y)if rx == ry:return Falseif size[rx] < size[ry]:parents[rx] = rysize[ry] += size[rx]else:parents[ry] = rxsize[rx] += size[ry]return True

🏷️ 按秩合并(Union by Rank)

辈分高的当族长

rank = [0] * (n + 1)def union(x, y):rx, ry = find(x), find(y)if rx == ry:return Falseif rank[rx] < rank[ry]:parents[rx] = ryelif rank[rx] > rank[ry]:parents[ry] = rxelse:parents[ry] = rxrank[rx] += 1return True

💡 组合使用建议

最推荐的并查集配置是:

路径压缩 + 按秩合并 或 按大小合并

能达到几乎 O(1) 的查询和合并效率。

📚 应用场景

  • Kruskal 最小生成树算法
  • 网络连通性判断
  • 动态连通块个数统计
  • 岛屿数量(LeetCode 200)
  • 冗余连接(LeetCode 684)
  • 朋友圈数量(LeetCode 547)

🎯 总结

术语含义
find(x)找出 x 所属集合的根节点
union(x, y)合并 x 和 y 的集合(若不属于同一集合)
路径压缩加快 find 查询效率
按秩/按大小优化合并策略,防止退化
树的结构集合之间的连接关系

并查集看起来简单,背后其实是极高效的数据结构设计。建议掌握它,并尝试应用到图论、集合问题中去!


🧩 常见练习题

✅ 基础入门题

题号题目名称链接简介
200岛屿数量LeetCode 200判断二维网格中有多少个连通块
684冗余连接LeetCode 684找出图中导致环的边
1319连通网络的操作次数LeetCode 1319判断有多少连通块,以及最少连接次数

🧠 中级应用题

题号题目名称链接简介
1202交换字符串中的元素LeetCode 1202使用并查集形成交换组,对组内排序
721账户合并LeetCode 721通过邮箱合并属于同一用户的账户
323无向图中连通分量的数目LeetCode 323通用连通块计数问题

🔍 进阶与变种题

题号题目名称链接简介
399除法求值LeetCode 399带权并查集:维护节点之间的比例关系
547省份数量(等价朋友圈问题)LeetCode 547判断有多少朋友圈/省份
990等式方程的可满足性LeetCode 990并查集维护等式约束

📌 推荐练习顺序

  1. 200 - 岛屿数量
  2. 684 - 冗余连接
  3. 1319 - 连通网络的操作次数
  4. 547 - 省份数量
  5. 1202 - 字符串交换
  6. 721 - 邮箱合并
  7. 399 - 除法求值
  8. 990 - 等式方程可解性

🧠 建议掌握:

  • 基础并查集结构(find, union
  • 路径压缩优化
  • 带权并查集(维护差值、比例等信息)
  • 一维映射(如坐标 → 编号)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙HarmonyOS埋点SDK,ClkLog适配鸿蒙埋点分析

ClkLog埋点分析系统&#xff0c;是一种全新的、开源的洞察方案&#xff0c;它能够帮助您捕捉每一个关键数据点&#xff0c;确保您的决策基于最准确的用户行为分析。技术人员可快速搭建私有的分析系统。 ClkLog鸿蒙埋点SDK通过手动埋点的方式实现HarmonyOS 原生应用的前端数据采…

JMeter的关联

关联&#xff1a;上一个请求的响应结果和下一个请求的数据有关系 xpath提取器 适用场景 HTML/XML文档结构化数据&#xff1a; 适用于从HTML或XML文档中提取结构化数据。例如&#xff0c;提取表格中的数据、列表中的项目等。示例&#xff1a;从HTML表格中提取所有行数据。 …

Spring Security 权限配置详解

&#x1f31f;Spring Security 权限配置详解&#xff1a;从基础到进阶 Spring Security 是一个功能强大、可高度自定义的安全框架&#xff0c;主要用于为基于 Spring 的应用程序提供身份验证和授权功能。 本篇文章将带你深入理解 Spring Security 的权限配置机制&#xff0c;掌…

pycharm中安装Charm-Crypto

一、安装依赖 1、安装gcc、make、perl sudo apt-get install gcc sudo apt-get install make sudo apt-get install perl #检查版本 gcc -v make -v perl -v 2、安装依赖库m4、flex、bison(如果前面安装过pypbc的话,应该已经装过这些包了) sudo apt-get update sudo apt…

【MCAL】AUTOSAR架构下基于SPI通信的驱动模块详解-以TJA1145为例

目录 前言 正文 1.TJA1145驱动代码中的SPI协议设计 1.1 对SPI Driver的依赖 1.2 对SPI配置的依赖 1.2.1 SpiExternalDevice 1.2.2 Channel_x 1.2.3 Job_x 1.2.4 Sequence N 1.2.5 Sequence M 1.2.6 Sequence L 1.2.7 小结 2.基于Vector驱动代码的SPI配置 2.1 SPI引…

JavaScript:BOM编程

今天我要介绍的是JS中有关于BOM编程的知识点内容&#xff1a;BOM编程&#xff1b; 介绍&#xff1a;BOM全名&#xff08;Browser Object Model&#xff08;浏览器对象模型&#xff09;&#xff09;。 是浏览器提供的与浏览器窗口交互的接口&#xff0c;其核心对象是 window。与…

Memcached缓存系统:从部署到实战应用指南

#作者&#xff1a;猎人 文章目录 一、安装libevent二、安装配置memcached三、安装Memcache的PHP扩展四、使用libmemcached的客户端工具五、Nginx整合memcached:六、php将会话保存至memcached Memcached是一款开源、高性能、分布式内存对象缓存系统&#xff0c;可应用各种需要缓…

解决前后端时区不一致问题

前后端时区不一致导致&#xff1a; 》数据不显示在前端 》页面显示时间有误 》一些对时间有要求的方法&#xff0c;无法正确执行&#xff0c;出现null值&#xff0c;加上我们对null值有判断/注解&#xff0c;程序就会报错中断&#xff0c;以为是业务逻辑问题&#xff0c;其实…

35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)

一、线程池概述 1、线程池的优势 线程池是一种线程使用模式&#xff0c;线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能&#xff0c;而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务&#xff0c;这避免了在处理短时间任务时创建与…

驱动开发硬核特训 · Day 6 : 深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 从静态绑定驱动模型到现代设备模型 主题&#xff1a;深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比 在上一节中&#xff0c;我们从驱动框架的历史演进出…

Blender安装基础使用教程

本博客记录安装Blender和基础使用&#xff0c;可以按如下操作来绘制标靶场景、道路标识牌等。 目录 1.安装Blender 2.创建面板资源 步骤 1: 设置 Blender 场景 步骤 2: 创建一个平面 步骤 3: 将 PDF 转换为图像 步骤 4-方法1: 添加材质并贴图 步骤4-方法2&#xff1a;创…

智能手机功耗测试

随着智能手机发展,用户体验对手机的续航功耗要求越来越高。需要对手机进行功耗测试及分解优化,将手机的性能与功耗平衡。低功耗技术推动了手机的用户体验。手机功耗测试可以采用powermonitor或者NI仪表在功耗版上进行测试与优化。作为一个多功能的智能终端,手机的功耗组成极…

从代码学习深度学习 - 多头注意力 PyTorch 版

文章目录 前言一、多头注意力机制介绍1.1 工作原理1.2 优势1.3 代码实现概述二、代码解析2.1 导入依赖序列掩码函数2.2 掩码 Softmax 函数2.3 缩放点积注意力2.4 张量转换函数2.5 多头注意力模块2.6 测试代码总结前言 在深度学习领域,注意力机制(Attention Mechanism)是自然…

学术版 GPT 网页

学术版 GPT 网页 1. 学术版 GPT 网页非盈利版References https://academic.chatwithpaper.org/ 1. 学术版 GPT 网页非盈利版 arXiv 全文翻译&#xff0c;免费且无需登录。 更换模型 System prompt: Serve me as a writing and programming assistant. 界面外观 References …

MarkDown 输出表格的方法

MarkDown用来输出表格很简单&#xff0c;比Word手搓表格简单多了&#xff0c;而且方便修改。 MarkDown代码&#xff1a; |A|B|C|D| |:-|-:|:-:|-| |1|b|c|d| |2|b|c|d| |3|b|c|d| |4|b|c|d| |5|b|c|d|显示效果&#xff1a; ABCD1bcd2bcd3bcd4bcd5bcd A列强制左对齐&#xf…

MetaGPT深度解析:重塑AI协作开发的智能体框架实践指南

一、框架架构与技术突破 1.1 系统架构设计 graph TBA[自然语言需求] --> B(需求解析引擎)B --> C{角色路由系统}C --> D[产品经理Agent]C --> E[架构师Agent]C --> F[工程师Agent]D --> G[PRD文档]E --> H[架构图]F --> I[代码文件]G --> J[知识共…

自用:在使用SpringBoot做学生信息管理系统时遇到的问题

1、在做完查询测试时&#xff0c;一直报出404找不到错误&#xff0c;原因是没有为各个层的实现类添加注解 2、改完之后发现测试没有数据&#xff0c;是因为我写的返回值类型为空&#xff0c;应该返回一个List< Student > 3、我没有想到要写Result实体类&#xff0c;因为不…

SQLite + Redis = Redka

Redka 是一个基于 SQLite 实现的 Redis 替代产品&#xff0c;实现了 Redis 的核心功能&#xff0c;并且完全兼容 Redis API。它可以用于轻量级缓存、嵌入式系统、快速原型开发以及需要事务 ACID 特性的键值操作等场景。 功能特性 Redka 的主要特点包括&#xff1a; 使用 SQLi…

202529 | RocketMQ 简介 + 安装 + 集群搭建 + 消费模式 + 消费者组

RocketMQ简介 RocketMQ 简介 Apache RocketMQ 是一款开源的 分布式消息中间件&#xff08;Message Queue, MQ&#xff09;&#xff0c;由阿里巴巴团队研发并捐赠给 Apache 基金会&#xff0c;现已成为顶级项目。它专为 高吞吐、低延迟、高可靠 的分布式场景设计&#xff0c;广…

Go语言--语法基础4--基本数据类型--整数类型

整型是所有编程语言里最基础的数据类型。 Go 语言支持如下所示的这些整型类型。 需要注意的是&#xff0c; int 和 int32 在 Go 语言里被认为是两种不同的类型&#xff0c;编译器也不会帮你自动做类型转换&#xff0c; 比如以下的例子会有编译错误&#xff1a; var value2 in…