讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

并查集是什么?并查集的路径压缩

夏强酱_9815

夏强酱_9815

发布时间:2025-08-22 11:25:01

|

253人浏览过

|

来源于php中文网

原创

并查集是一种用于管理元素分组的树形数据结构,支持高效的合并(union)和查找(find)操作,判断两元素是否同属一个集合;初始化时每个元素自成集合,通过parent数组记录父节点,初始时parent[i]=i;查找操作通过递归找到根节点,路径压缩在查找过程中将沿途节点直接连接到根节点,显著降低后续查找的时间复杂度;合并操作通过将一棵树的根连接到另一棵树的根实现集合合并,结合按秩合并(利用rank数组记录树高上界,优先将较矮树挂到较高树下)可有效维持树的平衡,防止退化为链表;路径压缩虽改变实际树高并使rank不再精确反映真实高度,但其仍可作为上界指导合并,确保性能稳定;两者结合后,查找与合并的均摊时间复杂度接近o(1);并查集常用于判断图的连通性、计算连通分量、朋友圈问题及kruskal最小生成树算法;其空间复杂度为o(n),主要消耗于parent和rank两个数组,其中n为元素数量。

并查集是什么?并查集的路径压缩

并查集,简单来说,就是用来管理元素分组情况的数据结构。它能高效地进行合并(union)和查询(find)操作,判断两个元素是否属于同一组。路径压缩是优化并查集性能的关键技巧,能显著降低后续操作的时间复杂度。

并查集的实现与路径压缩

并查集的核心思想是使用树形结构来表示集合。每个集合对应一棵树,树的根节点代表这个集合。

  1. 初始化: 初始时,每个元素都是一个独立的集合,即每个元素都是一棵只包含自己的树。我们可以用一个数组

    parent
    来记录每个元素的父节点,初始时
    parent[i] = i
    。

    def make_set(n):
        parent = list(range(n))
        return parent
  2. 查找(Find): 查找操作用于找到元素所属集合的根节点。

    def find(parent, i):
        if parent[i] == i:
            return i
        return find(parent, parent[i])
  3. 合并(Union): 合并操作用于将两个集合合并成一个集合。通常,我们将一棵树的根节点指向另一棵树的根节点。

    def union(parent, rank, x, y):
        root_x = find(parent, x)
        root_y = find(parent, y)
        if root_x != root_y:
            if rank[root_x] < rank[root_y]:
                parent[root_x] = root_y
            elif rank[root_x] > rank[root_y]:
                parent[root_y] = root_x
            else:
                parent[root_y] = root_x
                rank[root_x] += 1

    在上面的

    union
    函数中,
    rank
    数组用于优化合并操作,它记录了树的高度(或者说是树的深度的一个上界)。通过将高度较低的树连接到高度较高的树上,可以尽量保持树的平衡,避免出现极端情况下树退化成链表的情况。这部分叫做“按秩合并”。

    微信朋友圈爆款文案生成器
    微信朋友圈爆款文案生成器

    根据产品、场景和风格自动生成适合微信朋友圈的爆款文案,包含配图建议和互动引导。

    下载
  4. 路径压缩: 路径压缩是一种优化查找操作的技巧。在查找过程中,我们将访问过的每个节点直接指向根节点。这样,下次查找这些节点时,就可以直接找到根节点,而不需要沿着路径向上查找。

    def find(parent, i):
        if parent[i] == i:
            return i
        parent[i] = find(parent, parent[i]) # 路径压缩
        return parent[i]

    路径压缩的实现非常简单,只需要在

    find
    函数中,在递归返回之前,将当前节点的父节点设置为根节点即可。 路径压缩实际上改变了树的结构,但不会影响并查集的正确性。

并查集能解决什么问题?

并查集在很多场景下都有应用,比如:

  • 判断图的连通性: 可以用并查集来判断一个图是否连通,或者计算图中有多少个连通分量。
  • 朋友圈问题: 假设每个人都有一些朋友,朋友的朋友也是朋友,可以用并查集来找出有多少个朋友圈。
  • 最小生成树算法(Kruskal算法): Kruskal算法中,需要判断两个节点是否属于同一个集合,这时就可以使用并查集。

并查集的空间复杂度是多少?

并查集的空间复杂度是 O(n),其中 n 是元素的数量。我们需要一个

parent
数组来存储每个元素的父节点,以及一个
rank
数组(如果使用按秩合并)。

路径压缩会改变树的高度吗?对按秩合并有什么影响?

路径压缩会改变树的高度,使树变得更扁平。但需要注意的是,路径压缩只在查找操作中进行,它并不会更新

rank
数组。这意味着
rank
数组的值可能不再完全准确地反映树的实际高度,但它仍然可以作为树的高度的一个上界,用于指导合并操作,避免树退化成链表。按秩合并与路径压缩结合使用,可以使并查集的性能达到近乎 O(1) 的时间复杂度(均摊)。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

相关专题

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

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

849

2023.09.27

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2881

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

416

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

492

2026.05.09

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

7016

2023.08.14

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

0

2026.11.12

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

120

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

60

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Postman身份认证配置指南
Postman身份认证配置指南

共0课时 | 0人学习

Docker镜像构建手册
Docker镜像构建手册

共0课时 | 0人学习

LiblibAI API 开发手册
LiblibAI API 开发手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn