高级数据结构:并查集

文章目录

      • 1.什么是并查集:
      • 2、并查集的基本结构
      • 3.现实问题和代码实现链接
      • 4.代码实现

1.什么是并查集:

对于一个集合S={a1,a2,……an-1,an},这是可以对集合S进一步划分:S1,S2,……,Sm-1,Sm,我们希望能够快速确定S中的两两元素是否属于S的同一子集;
举个栗子,S={0,1, 2, 3, 4, 5, 6},如果我们按照一定的规则对集合S进行划分,假设划分后为S1={1, 2, 4}, S2={3, 6},S3={0, 5},任意给定两个元素,我们如何确定它们是否属于同一子集?某些合并子集后,又如何确定两两关系?基于此类问题便出现了并查集这种数据结构。
并查集有两个函数操作:
FInd:查找元素所有子集
Union:合并两个子集为一个新的集合;

2、并查集的基本结构

我们可以使用树这种数据结构来表示集合,不同的树就是不同的集合,并查集中包含了多棵树,表示并查集中不同的子集,树的集合是森林,所以并查集属于森林。 若集合S={0, 1, 2, 3, 4, 5, 6},最初每一个元素都是一棵树。如图:
在这里插入图片描述
这里紫色数字的是下标;

union操作:我们只需要将两棵树合并,例如合并0、1、2得到S1={0, 1, 2},合并3和4得到S2={3, 4}
在这里插入图片描述
物理结构:
由于 :1.并查集遵循双亲法:子节点存储父节点的下标;父节点存储该集合的节点个数的负值;

对于Find函数,我们只需要返回该元素所在树的根节点;所以,如果我们想要比较判断1和2是否在一个集合,只需要通过Find(1)和Find(2)返回各自的根节点比较是否相等便可。已知树中的一个节点,找到其根节点的时间复杂度为O(D),D为节点的深度。

节点之间的关联方法
这里有物理结构可以发现:节点之间的关联方法是:双亲表示法;在子节点内部存父节点的下标;

3.现实问题和代码实现链接

原本并查集会建立一个vector;
这里使用map集合来实现映射;现实中的集合(森林)的元素大概率不是数字,而是文字,所以这里可以使用map集合:map的每个元素可以存两个内容:映射的实现:一个内容填文字,另一个天填数字;
示例
main.c
在这里插入图片描述
头文件:
在这里插入图片描述
结果:
在这里插入图片描述

4.代码实现

#pragma once
#include<vector>
using namespace std;
class UnionFindSet
{
public :UnionFindSet(size_t n):_ufs(n , -1){}void Union(int x1, int x2){int root1 = FindRoot(x1);int root2 = FindRoot(x2);if (root1 == root2){return;}if (root1 > root2)swap(root1, root2);_ufs[root1] += _ufs[root2];_ufs[root2] = root1;}int FindRoot(int x){int root = x;while (_ufs[root] >= 0){root = _ufs[root];}return root;}bool IsSet(int x1, int x2){return FindRoot(x1) == FindRoot(x2);}size_t Setsize(){size_t size = 0;for (int i = 0; i < _ufs.size(); i++){if (_ufs[i] < 0){++size;}}return size;}private:vector<int> _ufs;
};

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

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

相关文章

阿里云迁移AWS视频点播技术攻坚

文章目录 &#x1f437; 背景&#x1f9a5; 简述&#x1f425; Aws服务&#x1f99c; AWS CloudFormation&#x1f41e; 问题&#x1f409; 落地方案&#x1f989; Aws vs Aliyun&#x1f344; 避坑指南 &#x1f437; 背景 由于AWS整体成本略低于阿里云&#xff0c;公司决定将…

R 批量对多个变量进行单因素方差分析 批量计算均值±标准差

多个变量批量进行单因素方差 R实现 文章目录 一、批量生成均值标准差 P值二、添加协变量单因素方差分析&#xff0c;生成校正P值三、在分层情况下进行单因素方差分析四、添加协变量和交互项的单因素方差分析&#xff0c;生成交互项的P值 一、批量生成均值标准差 P值 数据结构如…

Android AAudio

文章目录 基本概念启用流程基本流程HAL层对接数据流计时模型调试 基本概念 AAudio 是 Android 8.0 版本中引入的一种音频 API。 AAudio 提供了一个低延迟数据路径。在 EXCLUSIVE 模式下&#xff0c;使用该功能可将客户端应用代码直接写入与 ALSA 驱动程序共享的内存映射缓冲区…

数字图像处理(图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波)

数字图像处理&#xff08;图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波&#xff09; 目录 1 图像灰度变换 1.1 灰度线性变换 1.2 图像二值化 1.3 负象变换 1.4 灰度非线性变换 1.5 程序设计流程图 2 图像直方图及均衡 2.1 直方图 2…

Linux 服务器磁盘满了怎么办?详细清理大文件指南

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Agilent安捷伦E4407B频谱分析仪26.5GHz

E4407B是安捷伦ESA-E系列频谱分析仪&#xff0c;它是一款能够适应未来需要的中性能频谱分析仪解决方案。该系列在测量速度、动态范围、精度和功率分辨能力上&#xff0c;都为类似价位的产品建立了性能标准。其灵活的平台设计使得研发、制造和现场服务工程师能够自定义产品&…

特征工程筛选重要变量

特征筛选主要分为3个方法&#xff1a;过滤法、嵌入法&#xff08;经典的一些树模型比如xgboost&#xff09;、包裹法&#xff08;经典的RFECV&#xff0c;RFE递归特征消除法&#xff09; 过滤法更快速&#xff0c;但更粗糙。 包装法和嵌入法更精确&#xff0c;比较适合具体到算…

【代码随想录】刷题笔记Day46

前言 刚考完自辩&#xff0c;Chat回答举例什么的真方便。早上做组会PPT去了&#xff0c;火速来刷题&#xff01; 139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 单词是物品&#xff0c;字符串s是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把…

SpringBoot学习(五)-Spring Security配置与应用

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! Spring Security Spring Security是一个基于Java的开源框架&#xff0c;用于在Java应用程…

【深度学习】cv领域中各种loss损失介绍

文章目录 前言一、均方误差二、交叉熵损失三、二元交叉熵损失四、Smooth L1 Loss五、IOU系列的loss 前言 损失函数是度量模型的预测输出与真实标签之间的差异或误差&#xff0c;在深度学习算法中起着重要作用。具体作用&#xff1a; 1、目标优化&#xff1a;损失函数是优化算法…

文件归类妙招:用关键字替换改扩展名方法,文件重命名技巧

在日常工作中&#xff0c;文件的数量会随着时间的推移不断增加。如果文件没有得到适当的归类和整理&#xff0c;就会导致很难找到所需的文件。所以文件归类是非常重要的任务。现在来看云炫文件管理器一些实用的文件归类妙招&#xff1a;用关键字替换修改文件扩展名的方法&#…

Kubernetes复习总结(二):Kubernetes容器网络

2、Kubernetes容器网络 1&#xff09;、Docker网络原理 Docker默认使用的网络模型是bridge&#xff0c;这里只讲bridge网络模型 1&#xff09;容器之间通信原理 当安装完docker之后&#xff0c;docker会在宿主机上创建一个名叫docker0的网桥&#xff0c;默认IP是172.17.0.1…

AI动作冒险电影《加勒比海盗:失落的宝藏》(下)

AI动作冒险电影《加勒比海盗&#xff1a;失落的宝藏》&#xff08;下&#xff09; 在宝藏岛屿的探险中&#xff0c;杰克船长不断遭遇铁钩胡克的追击&#xff0c;并陷入了一系列生死危机中。然而&#xff0c;当杰克终于找到宝藏所在的洞穴时&#xff0c;却发现了一个令人震惊的事…

HarmonyOS 开发基础(五)Button

HarmonyOS 开发基础&#xff08;五&#xff09;Button Entry Component struct Index {build() {Row() {Column() {// Button&#xff1a;ArkUI 的基础组件 按钮组件// label 参数&#xff1a;文字型按钮Button(我是按钮)// width&#xff1a;属性方法&#xff0c;设置组件的宽…

shell编程-分支语句和循环结构

流控制: •在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。 •流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令 •exit语句:退出程序的执行&#xff0c;并返回一个返回码&#xff0c;返回码为0正常退出&#…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop中处理被激活的文件描述符的事件

文件描述符处理与回调函数 一、主要概念 反应堆模型&#xff1a;一种处理系统事件或网络事件的模型&#xff0c;当文件描述符被激活时&#xff0c;可以检测到文件描述符&#xff1a;在操作系统中&#xff0c;用于标识打开的文件、套接字等的一种数据类型 处理激活的文件描述符…

BUUCTF--pwnable_start1

查看保护&#xff1a; 32位程序保护全没开&#xff0c;黑盒测试下效果&#xff1a; 存在栈溢出&#xff0c;那么这题的想法就是直接ret2shellcode了。IDA中看看具体流程&#xff1a; 出奇的少&#xff0c;这题不能看反汇编的代码&#xff0c;直接去看汇编&#xff1a; 主要就2个…

【设计模式之美】面向对象分析方法论与实现(一):需求分析方法论

文章目录 一. 需求举例二. 对案例进行需求分析1. 第一轮基础分析2. 第二轮分析优化3. 第三轮分析优化4. 第四轮分析优化5. 最终确定需求 三. 小结 本文主要描述&#xff1a; 面向对象的需求分析方法论 一. 需求举例 假设&#xff0c;你正在参与开发一个微服务。微服务通过 HTT…

msvcr120.dll丢失怎样修复,三种修复msvcr120.dll丢失的方法

"msvcr120.dll"是一个重要的库文件&#xff0c;用于支持Microsoft Visual C 2013 Redistributable软件包中的应用程序。在本文中&#xff0c;我们将介绍"msvcr120.dll"文件的重要性和作用&#xff0c;并探讨当msvcr120.dll丢失怎样修复的办法。以及msvcr12…

Python基础教程——90行Python代码让微信地球转起来!!(完整版,附源码)

今天我们来一个好玩儿的东西&#xff0c;使用90行Python代码就可以让【微信第地球】转起来&#xff0c;太有意思啦&#xff01; 1.微信地球 手机重启后打开微信的一瞬间&#xff0c;会看到一幅有名的图片&#xff0c;上面站着一个张小龙。 你可曾想过这样一个问题&#xff0c…