讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现并查集 C++并查集的数据结构与实现

轻萱酱_3005

轻萱酱_3005

发布时间:2025-06-23 21:18:02

|

491人浏览过

|

来源于php中文网

原创

并查集是一种高效的集合合并与查询数据结构,主要用于判断元素是否属于同一集合或进行集合合并。其核心操作包括:1. makeset(x)创建包含元素x的集合;2. find(x)查找x所属集合的代表;3. union(x, y)合并x和y所在的集合。实现上使用数组存储父节点和秩,初始化时每个元素自成一集合,通过路径压缩和按秩合并优化性能,使时间复杂度接近o(α(n))。应用于图论中可判断连通性、检测环、构建最小生成树等。相比哈希表,并查集在动态集合合并效率更高,但不支持直接删除元素。

C++如何实现并查集 C++并查集的数据结构与实现

C++实现并查集,本质上就是解决集合的合并与查询问题,用来判断元素是否属于同一集合,或者将两个集合合并成一个。核心在于用树形结构表示集合,并利用路径压缩和按秩合并等技巧优化性能。

C++如何实现并查集 C++并查集的数据结构与实现

解决方案

并查集,也叫作不相交集合数据结构,主要操作包括:

C++如何实现并查集 C++并查集的数据结构与实现
  1. MakeSet(x):创建一个新的集合,其中包含元素x。x是这个集合的代表。
  2. Find(x):查找元素x所属的集合的代表。
  3. Union(x, y):将包含元素x和元素y的集合合并成一个集合。

C++实现通常使用数组来表示每个元素的父节点,初始化时每个元素的父节点指向自己,表示各自独立的集合。

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

立即学习“C++免费学习笔记(深入)”;

#include <iostream>
#include <vector>

using namespace std;

class DisjointSet {
public:
    DisjointSet(int n) : parent(n), rank(n, 0) {
        for (int i = 0; i < n; ++i) {
            parent[i] = i; // 初始化每个元素的父节点指向自己
        }
    }

    // 查找元素x所属集合的代表(带路径压缩)
    int Find(int x) {
        if (parent[x] != x) {
            parent[x] = Find(parent[x]); // 路径压缩:将x的父节点直接指向根节点
        }
        return parent[x];
    }

    // 合并包含元素x和元素y的集合(按秩合并)
    void Union(int x, int y) {
        int rootX = Find(x);
        int rootY = Find(y);

        if (rootX != rootY) {
            if (rank[rootX] < rank[rootY]) {
                parent[rootX] = rootY;
            } else if (rank[rootX] > rank[rootY]) {
                parent[rootY] = rootX;
            } else {
                parent[rootY] = rootX;
                rank[rootX]++; // 如果秩相同,则将其中一个树的秩增加1
            }
        }
    }

private:
    vector<int> parent; // 存储每个元素的父节点
    vector<int> rank;   // 存储每个集合的秩(树的高度的一个上界)
};

int main() {
    DisjointSet ds(10); // 创建一个包含10个元素的并查集

    ds.Union(0, 1);
    ds.Union(2, 3);
    ds.Union(4, 5);
    ds.Union(0, 2); // 将包含0和2的集合合并

    cout << "Find(0) = " << ds.Find(0) << endl; // 应该和Find(2)相同
    cout << "Find(2) = " << ds.Find(2) << endl;
    cout << "Find(1) = " << ds.Find(1) << endl; // 应该和Find(0), Find(2)相同
    cout << "Find(4) = " << ds.Find(4) << endl;
    cout << "Find(5) = " << ds.Find(5) << endl;

    return 0;
}

并查集在图论中的应用有哪些?

并查集在图论中用途广泛,最经典的应用之一是判断图的连通性。例如,可以用并查集来检测图中是否存在环。如果在一个无向图中,每次添加一条边,如果边的两个顶点已经在同一个集合中,那么就形成了环。此外,Kruskal算法中,也用并查集来判断加入的边是否会形成环,以此来构建最小生成树。还可以用来解决迷宫生成、社交网络分析等问题,核心在于维护节点之间的连通关系。

C++如何实现并查集 C++并查集的数据结构与实现

如何优化并查集的性能?

优化并查集性能的关键在于路径压缩和按秩合并。路径压缩是在Find操作时,将查找路径上的每个节点的父节点直接指向根节点,从而降低树的高度,减少后续查找的时间复杂度。按秩合并是在Union操作时,将秩较小的树合并到秩较大的树上,秩可以简单理解为树的高度。这样可以避免树的高度增长过快,保持树的平衡。通过这两种优化,并查集的平均时间复杂度可以接近O(α(n)),其中α(n)是反阿克曼函数,增长非常缓慢,可以认为是一个常数。

并查集与其他的集合数据结构(如哈希表)相比,有什么优缺点?

并查集专注于解决集合的合并与查询问题,特别是判断两个元素是否属于同一集合。与哈希表相比,并查集在处理动态集合合并方面更高效。哈希表适合于快速查找某个元素是否存在于集合中,但合并两个集合需要遍历其中一个集合的所有元素,效率较低。并查集的优点是实现简单,空间复杂度较低,查询和合并操作的平均时间复杂度接近常数级别。缺点是不能直接删除集合中的元素,因为删除操作会破坏树形结构。选择哪种数据结构取决于具体的应用场景和需求。如果需要频繁地合并集合,并查集是更合适的选择。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

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

DeepSeek

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

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

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

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

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

569

2023.09.27

treenode的用法
treenode的用法

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

2181

2023.12.01

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

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

316

2025.12.22

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

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

357

2026.01.06

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

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

392

2026.05.09

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

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

4816

2023.08.14

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

20

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

20

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

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