<数据结构>并查集

news2024/11/25 0:50:34

目录

并查集概念

合并

 查找集合的数量

并查集类代码实现


并查集概念

并查集和堆一样,都是通过数组来实现树的节点映射,不过并查集作用是,把一堆数据分为不同的几个小集合

不过并查集是森林的概念,并查集的学习可以帮助我们去更好的学习图这个数据结构

这里我们举一个例子:

假设我们有一个旅游团,一共有十个人,编号是0~9;

其中 s1 = {0,6,7,8} 这几个人来自湖北

        s2 = {1,4,9} 这几个人来自四川

        s3 = {2,3,4} 这几个人来自北京

上面我们把十个人分为了不同几个小组,他们来自不同的地方,吃的口味自然不同,于是就分别让0,1,2这三个人担任组长,带领各自的队伍去吃饭。

队长可以抽象的理解为头结点,组员理解为各自的孩子结点

数组的初始化规则定义如下:

1.每一个下标存放自己的双亲结点下标

2.如果该结点是双亲结点,存放一个负数,我们可以顺便存放这棵树的结点个数

特点:

  • 一个位置是负数,那他就是树的根,这个绝对值就是棵树的结点个数
  • 一个位置值是负数那他就是双亲的下标

合并

我们假设上面的s1和s2发生了合并,咋办呢?

步骤:

  • 先找到两个需要合并集合的双亲结点
  • 再把集合2的根下标存放的值+=集合1的根下标,在把集合2的根下标存放的值置为集合1的根

 查找集合的数量

我们只需要将整个数组遍历一遍,找到为负数的位置有多少个,即集合的数量

并查集类代码实现

class UnionFindSet
{
public:
	UnionFindSet(size_t n)
		:_ufs(n, -1)
	{}
	
	void Union(int x1, int x2)
	{
		// 1.先找根
		int root1 = FindRoot(x1);
		int root2 = FindRoot(x2);
		//如果在一个集合就没有必要去合并
		if (root1 == root2)
		{
			return;
		}
		//将集合2合并到集合1
		_ufs[root1] += _ufs[root2];
		_ufs[root2] = root1;
	}

	// 找根/双亲
	int FindRoot(int x)
	{ 
		int parent = x;
		while (_ufs[parent] >= 0)
		{
			parent = _ufs[parent];
		}

		return parent;
	}

	bool InSet(int x1, int x2)
	{
		return FindRoot(x1) == FindRoot(x2);
	}

	size_t SetSize()
	{
		size_t size = 0;
		for (size_t i = 0; i < _ufs.size(); ++i)
		{
			if (_ufs[i] < 0)
			{
				++size;
			}
		}

		return size;
	}

private:
	vector<int> _ufs;
};

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

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

相关文章

(QGIS)在QGIS中加载星图地球数据云的数据

本文以“瓦片数据”为例进行操作示例说明&#xff0c;类似矢量数据、地形数据等&#xff0c;方法步骤一样&#xff0c;将URL换成对应数据的示例网址与本人的token即可。 1、星图地球数据云上注册用户 注册登录星图地球数据云网站&#xff1a;https://datacloud.geovisearth.c…

Python 函数(二)

Python 函数&#xff08;二&#xff09; 一、可变参数、不可变参数 ​ 什么是可变类型&#xff0c;什么又是不可变类型&#xff1f; 这里我们首先要了解一个东西&#xff0c;在计算机程序中我们定义一个变量&#xff0c;并对其存储一个数值。这里有两个关键概念&#xff1a;内…

数码管显示(静态与动态)

文章目录 一、数码管简介二、数码管连接方式2.1 共阴极2.2 共阳极2.3 数码管真值表 三、数码管驱动方式3.1 静态显示3.2 动态显示四、Cyclone IV数码管原理图 五、模块代码六、引脚分配七、动态显示八、引脚分配 一、数码管简介 数码管分七段数码管和八段数码管。七段和八段的…

为什么不推荐在头文件中直接定义函数?

1. 函数的分文件编写 在C中&#xff0c;函数的分文件编写是一种让代码结构更加清晰的方法&#xff0c;通常可以分为以下几个步骤&#xff1a; 创建后缀名为 .h 的头文件&#xff0c;在头文件中写函数的声明&#xff0c;以及可能用到的其他头文件或命名空间创建后缀名为 .cpp …

ES6迭代器、Set、Map集合和async异步函数

目录 迭代器 Iterator 的作用 Iterator 的遍历过程 Set Map集合 map和对象区别? async异步函数 迭代器 迭代器&#xff08;Iterator&#xff09;就是这样一种机制。它是一种接口&#xff0c;为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口&…

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…

矩阵乘法的硬件加速

矩阵乘法的硬件加速 这里的硬件加速是指&#xff0c;如果依靠算法&#xff0c;可以通过减少访存次数来加速。可以将数据预取到cache来减少访存次数。 矩阵相乘最简单的实现 寄存器平铺矩阵乘法 将矩阵划分成多个小的矩阵块&#xff0c;小的矩阵块可以存放在寄存器中&#xff0…

QT开发技巧之嵌入式linux QT的QCombobox显示空白的问题

1.问题 开发平台&#xff1a;imx6ull qt版本&#xff1a;5.12.9 在嵌入式linux上运行的qt&#xff0c;QCombobox显示空白&#xff0c;不能显示其中的文本内容 2.解决办法 选中QCombobox&#xff0c;在属性栏中将foucsPolicy由WheelFocus改成NoFocus就好了

用户、角色、权限、菜单--数据库设计

用户角色关联表--user_role id-------------------主键 user_id------------用户ID role_id-------------角色ID create_time------创建时间 is_deleted--------状态&#xff08;0&#xff1a;未删除 1&#xff1a;删除&#xff09; 角色权限关联表--role_permission id------…

【PHP面试题50】Redis的主从复制实现原理是怎么样的?如何保证数据一致性?数据延迟又该如何处理?

文章目录 一、前言二、主从复制的基本原理三、数据一致性的保证四、数据延迟的处理四、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前关注锁定。 R…

OpenCv算子

目录 一、索贝尔(sobel)算子 二、沙尔(Scharr)算子 三、拉普拉斯算子 一、索贝尔(sobel)算子 边缘的定义: 边缘是像素值发生跃迁的位置&#xff0c;是图像的显著特征之一&#xff0c;在图像特征提取、对象检测、模式识别等方面都有重要的作用。 sobel算子对图像求一阶导数。…

【V8】【1. 内存布局、隐藏类Hidden Class】

JavaScript 中的对象是由一组组属性和值的集合。JavaScript 对象像一个字典&#xff0c;字符串作为键名&#xff0c;任意对象可以作为键值&#xff0c;可以通过键名读写键值。 在 ECMAScript 规范中定义了数字属性应该按照索引值大小升序排列&#xff0c;字符串属性根据创建时…

python将dataframe数据导入MongoDB非关系型数据库

文章目录 pymongo连接新建数据库和集合pandas导入数据插入数据数据查看 pymongo连接 import pymongo client pymongo.MongoClient("mongodb://localhost:27017/") dblist client.list_database_names() for db in dblist:print(db) #查看已有数据库admin bilibil…

apply()函数--Pandas

1. DataFrame.apply()函数 1.1 函数功能 对DataFrame沿着指定轴运用函数。 函数接收到的对象是Series对象&#xff0c;它们的索引可以是DataFrame的行索引&#xff08;axis0&#xff09;或列索引&#xff08;axis1&#xff09;。结果为Series或DataFrame。 1.2 函数语法 Da…

java基础浮点类型

目录 1&#xff1a;float类型和double类型的定义 2&#xff1a;二者的范围和精度 3&#xff1a;float类型详解 3.1&#xff1a;整数位10进制转换为2进制 3.2&#xff1a;小数位10进制转换为2进制 3.3&#xff1a;把二进制放到浮点类型中 3.4&#xff1a;精度损失 4&…

手动下载composer项目放在vendor目录下并加载

比如添加easywechat。 说是手动&#xff0c;其实半手动。 到GitHub或gitee下载 1、下载后放在项目根目录下的vendor文件夹 2、在项目根目录的文件composer.json文件添加一段 "autoload": {"psr-4": {"EasyWeChat\\": "vendor/overtrue/wech…

9.带你入门matlab假设检验(matlab程序)

1.简述 函数 ztest 格式 h ztest(x,m,sigma) % x为正态总体的样本&#xff0c;m为均值μ0&#xff0c;sigma为标准差&#xff0c;显著性水平为0.05(默认值) h ztest(x,m,sigma,alpha) %显著性水平为alpha [h,sig,ci,zval] ztest(x,m,sigma,alpha,tail) %sig为观察…

3.5 Bootstrap 输入框组

文章目录 Bootstrap 输入框组基本的输入框组输入框组的大小复选框和单选插件按钮插件带有下拉菜单的按钮分割的下拉菜单按钮 Bootstrap 输入框组 本章将讲解 Bootstrap 支持的另一个特性&#xff0c;输入框组。输入框组扩展自 表单控件。使用输入框组&#xff0c;您可以很容易地…

SpringCloud Alibaba——Ribbon底层怎样实现不同服务的不同配置

目录 一、Ribbon底层怎样实现不同服务的不同配置二、源码角度分析 一、Ribbon底层怎样实现不同服务的不同配置 为不同服务创建不同的spring上下文&#xff0c;不同的spring上下文中存放对应这个服务所有的配置。 二、源码角度分析 SpringClientFactory中可以获取到所有ribbon…

自动化运维工具——Ansible学习(一)

目录 一、运维自动化发展历程及技术应用 (二)程序发布相关知识 (三)常用的自动化运维工具 二、Ansible入门 (一)Ansible发展史 (二)特点 (三)Ansible架构 (四)工作原理 (五)Ansible主要组成部分 (六) 安装步骤 1.各种安装方法与命令 (1)rpm包安装&#xff1a;EPEL源…