当前位置: 首页 > news >正文

【数据结构】并查集的简单实现,合并,查找(C++)

文章目录

  • 前言
    • 举例:
  • 一、
    • 1.构造函数
    • 2.查找元素属于哪个集合FindRoot
    • 3.将两个集合归并成一个集合Union
    • 4.查找集合数量SetCount
  • 二、源码


前言

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

举例:

学生小分队s1={0,6,7,8},成都学生小分队s2={1,4,9},武汉学生小分队s3={2,3,5}就相互认识了,10个人形成了三个小团体。假设右三个群主0,1,2担任队长,负责大家的出行。
在这里插入图片描述

在这里插入图片描述

西安小分队中8号同学与成都小分队1号同学奇迹般的走到了一起,两个
小圈子的学生相互介绍,最后成为了一个小圈子:
在这里插入图片描述

仔细观察数组中内融化,可以得出以下结论:

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

一、

1.构造函数

UnionFindSet(size_t size):_set(size,-1)//数组中初始化为-1//数组的下标对应集合中元素的编号//数组的内容如果是非负数代表这个元素的根的下标//数组内容为负数,代表这个数字为根,绝对值为这棵树的大小{}

2.查找元素属于哪个集合FindRoot

size_t FindRoot(int x) {//. 查找元素属于哪个集合while (_set[x] >= 0) {x = _set[x];}//找到非负的数,这个数的下标即为根的下标return x;}

3.将两个集合归并成一个集合Union

void Union(int x1, int x2) {//将两个集合归并同一个集合//将元素x2合并进x1int root1 = FindRoot(x1);int root2 = FindRoot(x2);if (root1 != root2) {//保证两个元素不在同一个集合中_set[root1] += _set[root2];// x2根的内容为负数绝对值为这棵树的数量//把x2归并到x1所在集合中//x1所在集合的大小发生变化_set[root2] = root1;//x2的根发生变化}}

4.查找集合数量SetCount

size_t SetCount() {//统计集合数量(有多少棵树)int count = 0;for (size_t i = 0; i < _set.size(); i++) {if (_set[i] < 0) {count++;}}//负数的数量即根的数量即集合的数量return count;}

二、源码

class UnionFindSet {
public:UnionFindSet(size_t size):_set(size,-1)//数组中初始化为-1//数组的下标对应集合中元素的编号//数组的内容如果是非负数代表这个元素的根的下标//数组内容为负数,代表这个数字为根,绝对值为这棵树的大小{}size_t FindRoot(int x) {//. 查找元素属于哪个集合while (_set[x] >=0) {x = _set[x];}//找到非负的数,这个数的下标即为根的下标return x;}void Union(int x1, int x2) {//将两个集合归并同一个集合//将元素x2合并进x1int root1 = FindRoot(x1);int root2 = FindRoot(x2);if (root1 != root2) {//保证两个元素不在同一个集合中_set[root1] += _set[root2];// x2根的内容为负数绝对值为这棵树的数量//把x2归并到x1所在集合中//x1所在集合的大小发生变化_set[root2] = root1;//x2的根发生变化}}size_t SetCount() {//统计集合数量(有多少棵树)int count = 0;for (size_t i = 0; i < _set.size(); i++) {if (_set[i] < 0) {count++;}}//负数的数量即根的数量即集合的数量return count;}private:vector<int> _set;};

相关文章:

【数据结构】并查集的简单实现,合并,查找(C++)

文章目录 前言举例&#xff1a; 一、1.构造函数2.查找元素属于哪个集合FindRoot3.将两个集合归并成一个集合Union4.查找集合数量SetCount 二、源码 前言 需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规…...

2023美团商家信息

2023美团商家电话、地址、经纬度、评分、均价、执照......

0155 - Java 数组

1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合&#xff0c;实现对这些数据…...

Java 语言有哪些特点

Java语言具有以下特点&#xff1a; 简单易学&#xff1a;Java语法相对简单&#xff0c;与C相比更容易上手。 面向对象&#xff1a;Java是一门纯粹的面向对象编程语言&#xff0c;支持封装、继承和多态等面向对象的特性。 平台无关性&#xff1a;Java程序可以在不同的操作系统…...

SAP 特殊采购类50简介----虚拟件

今天我们测试一下特殊类50,也就是我们常说的虚拟件。 虚拟物料是库存中实际不存在的物料清单(BOM)的子装配件,它用于简化物料清单。尽管虚拟物料出现在物料清单中,但生产订单显示制造虚拟物料所需的组件,而不是虚拟物料本身。 我们举个列子,生产的手机是有包装的,有盒子…...

C语言——内存函数的使用与模拟实现

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing 原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位…...

Mysql索引事务(面试高频)

文章目录 目录 文章目录 前言 一 . 索引 1.1 概念 1.2 作用 1.3 使用场景 1.4 存储引擎 二 . 事务 2.1 事务的概念 2.2 事务四大特性 前言 大家好,今天给大家绍一下mysql索引和事务 一 . 索引 1.1 概念 索引是一种特殊的文件,包含着对数据表中的所有记录的引用指针…...

SpringCloudGateway 3.1.4版本 Netty内存泄漏问题解决

一、 产生的异常 当时是服务器访问不到服务了&#xff0c;上去一看&#xff0c;无法申请资源OutOfDirectMemoryError了&#xff0c;内存级别的东西让人一阵头大&#xff0c;赶紧在线下模拟&#xff0c; 1. 减少分配的堆外内存&#xff0c;打开Netty的监测工具等有助于复现的…...

STM32内部是怎么工作的

STM32是怎么工作的 1 从孩子他妈说起2 早期计算机的组成2.1 五大元件&#xff08;1&#xff09;第一个出场的是电容元件&#xff08;2&#xff09;第二个出场的是二极管&#xff08;3&#xff09;第三个出场的是电阻元件&#xff08;4&#xff09;第四个出场的是电感&#xff0…...

MyBatis的配置文件

目录 MyBatis配置 1.properties标签 2.typeAliases标签 3.Mappers标签 一个最全面的MyBatis配置文件可能会包含各种不同的设置和选项&#xff0c;根据实际情况&#xff0c;可以根据需要添加或删除配置。以下是一个包含各种可能设置的示例。 这个配置文件包含了环境设置、数…...

MCU平台下确定栈空间大小的方法

本文介绍MCU平台下确定栈空间大小的方法。 通常使用IDE开发MCU程序在生成Image文件时&#xff0c;Image文件被划分为代码区&#xff0c;数据区&#xff0c;BSS区&#xff0c;堆区&#xff0c;栈区。其中&#xff0c;代码区&#xff0c;数据区&#xff0c;BSS区空间大小由编译器…...

Flink系列之:SQL提示

Flink系列之&#xff1a;SQL提示 一、动态表选项二、语法三、例子四、查询提示五、句法六、加入提示七、播送八、随机散列九、随机合并十、嵌套循环十一、LOOKUP十二、进一步说明十三、故障排除十四、连接提示中的冲突案例十五、什么是查询块 SQL 提示可以与 SQL 语句一起使用来…...

机器学习算法---聚类

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…...

gitlab ci pages

参考文章 gitlab pages是什么 一个可以利用gitlab的域名和项目部署自己静态网站的机制 开启 到gitlab的如下页面 通过gitlab.ci部署项目的静态网站 # build ruby 1/3: # stage: build # script: # - echo "ruby1"# build ruby 2/3: # stage: build …...

Web ML 库的Transformers.js 提供文本转语音功能

JavaScript 库 Transformers.js 提供了类似 Python Transformers 库的功能&#xff0c;设计用于在 Web 浏览器中直接运行 Transformer 模型&#xff0c;而不再需要外部服务器参与处理。在最新的 2.7 版本中&#xff0c;Transformers.js 引入了增强功能&#xff0c;其中包括文本…...

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜E

老老规矩&#xff0c;看目录&#xff0c;平均每年2E&#xff0c;跟2D一样&#xff0c;D是全对&#xff0c;E是全错&#xff0c;侧面也看出10道题&#xff0c;大概是3A/B&#xff0c;3C&#xff0c;2D&#xff0c;2E&#xff0c;其实还是蛮平均的。但E为1道的情况居多。 第20题…...

【Linux基本指令(2)】

文章目录 一. 基本指令第二回 一. 基本指令第二回 cp指令语法 cp src dst 将目标文件或者目录拷贝到指定目录下或文件下。注意同级目录下&#xff0c;不允许存在同名文件或同名目录。如果将一个file.txt文件拷贝到当前目录下&#xff0c;就重名了&#xff0c;报错cp不了&#…...

Debian系统设置SSH密钥登陆

如果没有安装ssh&#xff0c;root权限运行apt install openssh-server进行安装。 ssh-keygen -t rsa # 生成配对密钥&#xff0c;后续一路enter即可会在用户目录&#xff08;即~这个&#xff09;下生成.ssh文件夹&#xff0c;里面的id_rsa是私钥&#xff0c;id_rsa.pub是公钥…...

uniapp cli开发和HBuilderX开发

uniapp cli开发和HBuilderX开发 前言 uniapp是一个跨平台的开发框架&#xff0c;可以开发出微信小程序、支付宝小程序、百度小程序、头条小程序、H5、App等&#xff0c;开发者只需要写一套代码&#xff0c;就可以发布到各个平台&#xff0c;大大提高了开发效率。 uniapp的开…...

【Java异常】idea 报错:无效的目标发行版:17 的解决办法

【Java异常】idea 报错&#xff1a;无效的目标发行版&#xff1a;17 的解决办法 一&#xff0c;问题来源 springcloud的第一个demo项目就给我干趴了 二、原因分析 java: 无效的目标发行版: 17 原因就是 JDK 版本不对。从 IDEA 编辑器中可以找到问题的原因所在&#xff0c;…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...