数据结构——并查集

embedded/2025/2/5 19:53:02/

 一、并查集原理
 

再一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于哪个集合。适合这种问题的抽象数据结构称为并查集(union-findset)

并查集并查集,就是看你在哪个集合中,并且可以将集合合并的数据结构

它的核心思想是用一个数组来表示每个元素的父节点,从而形成树状结构。
数组的下标通常代表元素本身,而数组的值表示该元素的父节点。
例如,p[i] 表示元素i的父节点,根节点的父节点指向自己。

二、并查集的实现

初始化 init( )
void init(int n){for (int i = 1; i <= n; ++ i) p[i] = i;
}

 开始时,每个元素自成一个单元素集合,所以初始化时,初始化为每个节点的父节点为自己,根节点的父节点指向自己。

查找根节点 find( ) 
int find(int x ){//查询祖宗节点 + 路径压缩if(p[x] != x) p[x] = find(p[x]);//路径压缩return p[x];
}

 通过路径压缩,将每次查询后的元素都指向根节点,这样一来能使每次查找根节点的过程满足近乎O( 1 )的速度,使得效率大大提高。

合并两个集合union( )
void union(int a , int b){p[find(a)] = find(b);
}

先查询a 和 b的祖宗节点(即,根节点)然后将a祖宗节点作为子节点插入到b的祖宗节点下。

在合并过程中,在逻辑模型上,是将a树根节点插入到b树的根节点上,
在物理模型上只是将记录a的根节点对应的数组中的元素,改为b根节点,

原本a根节点的父节点不再指向自己,也就意味着原本的a根节点不再是根节点。

判断两个集合是否在同一个集合check()
bool check(int a , int b){return find(a) == find(b); 
}

在同一个集合中,子节点的祖宗节点相同,所以判断祖宗节点是否一样可以判断是否在同一个集合中 

三、小结

并查集的要点是用一个数组记录每一个元素的父节点,根节点的父节点指向自己
数组下标代表各个元素,而元素的值表示其父节点,两者共同维护了并查集的树形结构,使得查找和合并操作能够高效进行。

四、小试牛刀

1. LeetCode
  • 链接:https://leetcode.com(国际版)
    https://leetcode.cn(中国版)

  • 推荐题目

    • 547. 朋友圈(基础连通性问题)

    • 684. 冗余连接(检测环 + 并查集)

    • 200. 岛屿数量(DFS/BFS/并查集均可)

  • 搜索方法:在题库中搜索关键词 Union-Find 或 并查集


2. 洛谷(Luogu)
  • 链接:https://www.luogu.com.cn

  • 推荐题目

    • P3367 【模板】并查集(模板题)

    • P1551 亲戚(基础应用)

    • P1525 关押罪犯(并查集 + 贪心)

  • 搜索方法:直接搜索题号或关键词 并查集


3. 牛客网(Nowcoder)
  • 链接:https://www.nowcoder.com

  • 推荐题目

    • NC14550 并查集模板题

    • NC50428 食物链(带权并查集)

  • 搜索方法:在题库中筛选 算法 → 并查集 标签。


4. Codeforces
  • 链接:https://codeforces.com

  • 推荐题目

    • Problem 25C - Roads in Berland(动态连通性问题)

    • Problem 445B - DZY Loves Chemistry(连通块计数)

  • 搜索方法:在 Problemset 页面按 Tag 选择 DSU(Disjoint Set Union,即并查集)。


 


http://www.ppmy.cn/embedded/159830.html

相关文章

Day 28 卡玛笔记

这是基于代码随想录的每日打卡 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2…

Kafka常见问题之 java.io.IOException: Disk error when trying to write to log

文章目录 Kafka常见问题之 java.io.IOException: Disk error when trying to write to log1. 问题概述2. 问题排查方向&#xff08;1&#xff09;磁盘空间不足&#xff08;2&#xff09;磁盘 I/O 故障&#xff08;3&#xff09;Kafka 日志文件损坏&#xff08;4&#xff09;Kaf…

Docker 安装详细教程(适用于CentOS 7 系统)

目录 步骤如下&#xff1a; 1. 卸载旧版 Docker 2. 配置 Docker 的 YUM 仓库 3. 安装 Docker 4. 启动 Docker 并验证安装 5. 配置 Docker 镜像加速 总结 前言 Docker 分为 CE 和 EE 两大版本。CE即社区版&#xff08;免费&#xff0c;支持周期7个月&#xff09;&#xf…

为什么“记住密码”适合持久化?

✅ 特性 1&#xff1a;应用重启后仍需生效 记住密码的本质是长期存储用户的登录凭证&#xff08;如用户名、密码、JWT Token&#xff09;&#xff0c;即使用户关闭应用、重启设备&#xff0c;仍然可以自动登录。持久化存储方案&#xff1a; React Native 推荐使用 AsyncStorag…

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1&#xff1a;如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」&#xff0c;deepseek便爆火 爆火以后便应了“人红是非多”那句话&#xff0c;不但遭受各种大规模攻击&#xff0c;即便…

Haskell语言的数据可视化

Haskell语言的数据可视化 引言 数据可视化是数据科学与分析中的重要组成部分。通过将数据以直观的图形和图表形式展示出来&#xff0c;用户能够更容易地理解和分析数据。虽然Python和R是数据可视化的主流语言&#xff0c;但Haskell作为一种函数式编程语言&#xff0c;也具备强…

玩转大语言模型——使用langchain和Ollama本地部署大语言模型

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…

【C++】STL——vector底层实现

目录 &#x1f495; 1.vector三个核心 &#x1f495;2.begin函数&#xff0c;end函数的实现&#xff08;简单略讲&#xff09; &#x1f495;3.size函数&#xff0c;capacity函数的实现 &#xff08;简单略讲&#xff09; &#x1f495;4.reserve函数实现 &#xff08;细节…