【数据结构】并查集

并查集是简单的数据结构,学会并查集,为图打好基础。

并查集的概念

是树状的数据结构,用于处理相交集合的合并与查询

通常用森林表示,一片森林表示一个集合

并查集一般需要完成

  1. 查找元素属于哪个集合
  2. 查看两个元素是否属于同一个集合
  3. 将两个集合归并成一个集合
  4. 集合的个数


并查集的原理
 

假设有10个人,用集合表示为{0,1,2,3,4,5,6,7,8,9}

我们用数组表示这十个人

  1. 数组的下标表示人的编号
  2. 数组的内容表示每个人认识其中人的数目 (-1 表示只认识自己)

表示为10片森林

经过一段时间后,他们形成三个小团体,s1{0,6,7,8}  s2{1,4,9} s3{ 2,3,5}

利用并查集表示

  • 数组的下标对应集合中元素的编号
  • 数组中如果为负数,负号代表根,数字代表该集合中元素个数
  • 数组中如果为非负数,代表该元素双亲在数组中的下标

所以在并查集中,我们会关注数组的下标和数组的内容。

如果数组的内容是负数,那么他就是根(Root)

如果数组的内容为(非负数),那么就指向他的父亲。

所以我们能简单解决这些问题

  • 查找元素属于哪个集合

沿着树形关系一直往上寻找到根(直到找到内容为负数的)

  • 查看元素是否属于同一个集合

寻找到根,不同则表示不是同一个集合

  • 将两个集合归并成一个集合

一个集合归并到另一个集合中,并修改集合的内容

  • 集合的个数

多少个负数内容的位置,就有多少个集合

接下来,来简单实现一个并查集


并查集的模拟

框架

//并查集
class UnionFindSet {
public://构造函数UnionFindSet(int n);//查找元素所在的集合int findRoot(int x);//合并两个元素所在的集合void Union(int x1, int x2)//获取并查集中集合的个数int SetCount();
private:vector<int> _set;各个结点之间的关系
};

构造

接收vector容器应该预留的空间

初始化为-1

	UnionFindSet(int size):_set(size,-1){}

不需要自定析构函数

默认会调用系统默认析构


查找root

一直向上寻找,变换x ,直到找到内容为负数

	//查找元素是否在集合里size_t FindRoot(int x){while (_set[x] >= 0){x = _set[x];}return x;}

合并俩个集合

将B合并到A中,A的根内容要改变,B的根内容也要改变

	//合并void Union(int x1, int x2){int root1 = FindRoot(x1);int root2 = FindRoot(x2);if (root1 != root2){_set[root1] += _set[root2];_set[root2] = root1;	}}

路径压缩

如果有大量的数据,那么树的层数可能非常高,查找的时候就需要一层一层往上迭代。这时候很浪费效率,这里就提出路径压缩。

路径压缩一般发送在查找根结点,会压缩路径上的所有结点,挂接到根上。

	size_t FindRoot(int x){//找根size_t root = x;while (_set[x] >= 0){x = _set[x];}//压缩while (_set[x] >= 0){size_t parent = _set[x];_set[x] = root;x = parent;}return root;}

Gitee:提取代码

相关题目

LCR 116. 省份数量

思路:
运用并查集的相关知识

题目给我们一个相邻矩阵,遍历一半矩阵就能知道连通的关系。

我们把矩阵中为1的放到一个集合中,返回集合的数目

解题时,运用lambda表达式,调用找根root的函数。

class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) {int n=isConnected[0].size();vector<int> _ufs(n,-1);//找根 >=0 就往上找auto FindRoot=[&_ufs](int x){int parent=x;while(_ufs[parent]>=0){parent=_ufs[parent];}return parent;};//遍历,遇到1 并且根不同 就合并 for(int i=0;i<n;i++){for(int j=0;j<=i;j++){if(isConnected[i][j]==1){int root1=FindRoot(i);int root2=FindRoot(j);if(root1!=root2){_ufs[root1]+=_ufs[root2];_ufs[root2]=root1;}}}}int count =0;for(auto x:_ufs){if(x<0)count++;}return count;}
};

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

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

相关文章

JDBC 核心 API

引入 mysql-jdbc 驱动 驱动 jar 版本的选择&#xff1a;推荐使用 8.0.25&#xff0c;省略时区设置java 工程导入依赖 项目创建 lib 文件夹导入驱动依赖 jar 包jar 包右键 - 添加为库 JDBC 基本使用步骤 注册驱动获取连接创建发送 sql 语句对象发送 sql 语句&#xff0c;并获…

GPT SOVITS项目 一分钟克隆 (文字输出)

步骤流程&#xff1a;&#xff08;首先使用UVR 提取人声文件&#xff0c;然后按下面步骤进行&#xff09; 注意这里提交的音频是参考的音频

深度学习:Pytorch安装的torch与torchvision的cuda版本冲突问题与解决历程记录

今天不小心将conda环境中的一个pytorch环境中的torch包给搞混了&#xff0c;将其更新了一下&#xff0c;发生了一些问题&#xff1a; 当时运行了一下这个代码&#xff1a; pip install torchvision --upgrade 导致了环境中包的混乱&#xff1a; 只能说欲哭无泪&#xff0c;当…

C语言strstr函数

简介 strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是&#xff0c;则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串&#xff1b;否则&#xff0c;返回NULL。 实验 #include "stdio.h" #include "string.h"c…

相机图像质量研究(20)常见问题总结:CMOS期间对成像的影响--全局快门/卷帘快门

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【前端高频面试题--git篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 前端高频面试题--git篇 往期精彩内容常用命令git add 和 git stage 有什么区别怎么使用git连接…

代码随想录算法训练营DAY18 | 二叉树 (5)

一、LeetCode 513 找树左下角的值 题目链接&#xff1a;513.找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/ 思路一&#xff1a;递归回溯全局变量比深度。 class Solution {int Max_depth 0;int result 0;public int findBottomLeftValue(TreeNo…

“分布式透明化”在杭州银行核心系统上线之思考

导读 随着金融行业数字化转型的需求&#xff0c;银行核心系统的升级改造成为重要议题。杭州银行成功上线以 TiDB 为底层数据库的新一代核心业务系统&#xff0c;该实践采用应用与基础设施解耦、分布式透明化的设计开发理念&#xff0c;推动银行核心系统的整体升级。 本文聚焦…

2024 年 11 款最佳 iPhone 数据恢复软件和应用程序

数据丢失是任何人都无法承受的&#xff0c;因为它对每个人都至关重要。但导致数据丢失的原因有很多&#xff0c;一些常见的原因是意外删除数据、设备被盗、iOS 越狱、硬件损坏、病毒感染等。我们列出了 iOS 的顶级恢复工具&#xff0c;其中包括&#xff1a;将帮助您方便地恢复数…

【AIGC】Stable Diffusion的生成参数入门

Stable Diffusion 的生成参数是用来控制图像生成过程的重要设置&#xff0c;下面是一些常见的生成参数及其详解 1、采样器&#xff0c;关于采样器的选择参照作者的上一篇文章 2、采样步数&#xff08;Sampling Steps&#xff09;是指在生成图像时模型执行的总步数&#xff0c…

一、ActiveMQ介绍

ActiveMQ介绍 一、JMS1.jms介绍2.jms消息传递模式3.JMS编码总体架构 二、消息中间件三、ActiveMQ介绍1.引入的原因1.1 原因1.2 遇到的问题1.3 解决思路 2.定义3.特点3.1 异步处理3.2 应用系统之间解耦3.3 实际-整体架构 4.作用 一、JMS 1.jms介绍 jms是java消息服务接口规范&…

Apache POI | Java操作Excel文件

目录 1、介绍 2、代码示例 2.1、将数据写入Excel文件 2.2、读取Excel文件中的数据 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步…

基于Python实现Midjourney集成到(个人/公司)平台中

目前Midjourney没有对外开放Api&#xff0c;想体验他们的服务只能在discord中进入他们的频道进行体验或者把他们的机器人拉入自己创建的服务器中&#xff1b;而且现在免费的也用不了了&#xff0c;想使用就得订阅。本教程使用midjourney-api这个开源项目&#xff0c;搭建Midjou…

系统可靠性分析与设计

一、考点分析 可靠性相关基本概念&#xff08;※※&#xff09;系统可靠性分析&#xff08;※※※※&#xff09;软件可靠性设计&#xff08;※※※※&#xff09; 二、可靠性相关基本概念 可靠性&#xff1a;软件系统在应用或系统错误面前&#xff0c;在意外或错误使用的情况下…

搜索Agent方案

为啥需要整体方案&#xff0c;直接调用搜索接口取Top1返回不成嘛&#xff1f;要是果真如此Simple&Naive&#xff0c;New Bing岂不是很容易复刻->.-> 我们先来看个例子&#xff0c;前一阵火爆全网的常温超导技术&#xff0c;如果想回答LK99哪些板块会涨&#xff0c;你…

【初始C++】引用的概念及使用场景、引用与指针的区别、内联函数、类型推导关键字auto、范围for循环、指针空值nullptr

目录 1.引用 1.1引用的概念 1.2引用的特性 1.3使用场景 1.4引用与指针的区别 2.内联函数 2.1内联函数的概念 2.2内联函数的特征 3.auto关键字&#xff08;C11&#xff09; 4.基于范围的for循环&#xff08;C11&#xff09; 5.指针空值nullptr&#xff08;C11&#x…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第四天-ARM Linux编程之IIC与uart (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码&#xff1a;1688 教学内容&#xff1a; 1、I2C总线&#xff1a; I2C&#xff08;Inter&#xff0d;Integrated Circuit),PHILIPS公司开发的两线式半双工同步串行总线&#xff1b;可以用来连…

C/C++重点解析——内存管理

1. C/C内存分布 我们先来看一段代码和其相关问题&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd"…

中科大计网学习记录笔记(十一):CDN

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

【读书笔记】ICS设备及应用攻击(一)

工控系统通常是由互联设备所构成的大型复杂系统&#xff0c;这些设备包括类似于人机界面&#xff08;HMI&#xff09;、PLC、传感器、执行器以及其他使用协商好的协议进行相互通信的设备。所有交互背后的驱动力都是软件&#xff0c;软件为工控系统中几乎所有部分的运行提供支撑…