0

0

Python并查集怎么写_Disjoint Set路径压缩与连通性判断

P粉602998670

P粉602998670

发布时间:2026-03-14 15:12:43

|

777人浏览过

|

来源于php中文网

原创

并查集需手写find和union函数:find须路径压缩(递归更新parent[x]),union需先find再合并根节点;初始化用list(range(n)),连通性判断必须用find(a)==find(b)而非parent[a]==parent[b]。

python并查集怎么写_disjoint set路径压缩与连通性判断

Python 并查集怎么写:用 findunion 两函数打底

并查集不是 Python 标准库里的现成类,得自己写;核心就两个操作:find 查根节点,union 合并两棵树。别一上来就套模板,先写清楚这两个函数的逻辑——它们决定了后续所有行为。

常见错误是把 union 写成简单赋值(比如 parent[a] = b),没考虑谁当根、谁挂谁,结果树退化成链表,find 变成 O(n)。正确做法是让小树挂大树(按秩合并),或直接让被查节点指向根(路径压缩)。

实操建议:

  • find 必须递归或循环上溯到根,并在返回前重定向父指针(路径压缩的关键一步)
  • unionfind(a)find(b),再比较根是否相同;不同才合并,避免自环
  • 初始化用 parent = list(range(n)),别用字典——除非节点 ID 是稀疏非整数

路径压缩为什么必须改 parent 而不只是返回根?

路径压缩不是“查一次根就完事”,而是要永久扁平化访问路径。如果只在 find 里返回根却不更新中间节点的 parent,下次查同一节点还是得走老路,O(n) 问题照旧。

立即学习Python免费学习笔记(深入)”;

典型错误写法:return find(parent[x])(纯递归返回,没赋值)。正确写法是边回溯边更新:parent[x] = find(parent[x]),或者用循环 + 记录路径后批量更新。

示例(递归版):

def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])  # ← 这行不能少
    return parent[x]

注意:这行会改变原数组,调试时看到 parent 突然“跳变”别慌,这是压缩生效的表现。

闪念贝壳
闪念贝壳

闪念贝壳是一款AI 驱动的智能语音笔记,随时随地用语音记录你的每一个想法。

下载

连通性判断:别直接比 parent[a] == parent[b]

刚写完并查集容易犯这个错:以为两个节点父节点相等就代表连通。错——只有根节点相等才算连通,而 parent[a] 可能只是中间父节点,根本不是根。

正确姿势永远是:find(a) == find(b)。哪怕你加了路径压缩,也不能跳过 find 直接比 parent 数组值。

使用场景提醒:

  • 图中加边时判断是否成环:加之前 find(u) == find(v) 为真,说明已连通,再加就成环
  • 处理离线查询(如“此时 a 和 b 是否连通”):每轮操作后都靠 find 判定,不缓存中间 parent
  • 性能影响:多一次 find 调用,但换来 O(α(n)) 均摊复杂度,远好于 O(n)

按秩合并 vs 路径压缩:可以只选一个,但别漏掉关键细节

路径压缩单独用就能把均摊复杂度压到 O(α(n)),按秩合并(union by rank/size)主要是为了控制树高、辅助分析。实际项目里,光用路径压缩足够;但如果要严格保证单次 find 上限,就得加上按 size 合并。

容易踩的坑:

  • 按 size 合并时,更新的是根节点对应的 size 值,不是任意节点的 —— 别在 union 里写 size[a] += size[b],a/b 可能不是根
  • 路径压缩后 size 不再表示子树大小(因为结构变了),所以按 size 合并只能在 union 阶段用根的 size 比较,压缩过程不碰 size
  • Python 里用 listsize 比用 dict 快,尤其节点编号连续时

连通性问题本身不依赖树高,但如果你后续要枚举连通分量(比如每个根下拉所有子节点),没按秩合并+路径压缩混用,可能让遍历变慢——这点常被忽略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

129

2023.09.27

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

177

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

530

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号