并查集介绍

news2024/12/26 12:06:41

文章目录:

  • 并查集原理
  • 并查集实现
    • 并查集的类结构
    • 并查集的合并
    • 统计集合数量

并查集原理

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

并查集是一种树形的数据结构,用于处理一些不相交的集合的合并及查询问题。并查集的思想是用一个数组表示整片森林,数的根节点唯一标识了一个集合,我们只要能找到某个元素的树根,就能确定它在哪个集合里面。

例如:某校某班今年新招生10人,西安4人,成都3人,海南3人,10个人来自不同的地方,刚开始互相不认识,每个学生都是一个独立的小团体,现在给10个学生进行编号:0 - 9 号,下面我们用数组来存储该小集体,数组中的数字代表:该小集体中具有成员的个数。
在这里插入图片描述
到校之后,每个地方的学生自发组成一个小分队,即西安分队 s1 = {0,6,7,8},成都分队 s2 = {1,4,9},海南分队 s3 = {2,3,5},10个人形成了三个小团体。假设每个小分队的第一个成员 0,1,2 担任队长。
在这里插入图片描述
经过一段时间之后他们互相就熟悉起来了。
在这里插入图片描述

通过上面两图,可以得出以下结论:

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

来到学校学习一段时间之后,西安小分队中8号同学与成都小分队中1号同学成为了朋友,通过同学之间的相互结束,最后合并为一个小团体:
在这里插入图片描述
现在0集合有7个人,2集合有三个人,总共两个小团体。

通过以上,并查集一般可以解决下列问题:

  1. 查找元素属于哪个集合(沿着数组表示树形关系往上一直找到根,即树中元素为负数的位置)。
  2. 查看两个元素是否属于同一个集合(沿着数组表示的树形关系一直往上找到树的个,若两个元素根在同一个集合,那么就在一个集合,否则不在一个集合)。
  3. 将两个集合合并为一个集合(将两个集合中的元素合并,让其中一个集合的名称改为另外一个集合的名称)。
  4. 统计集合的个数(遍历数组,统计数组中元素为负数的个数即为集合的个数)。

并查集实现

并查集的类结构

并查集的底层结构使用 vector 实现,在初始化的时候,将 vector 中的每个位置的值置为 -1。便于统计每个小集合中元素的个数。

class UnionFindSet
{
public:
	// 初始化时,将数组中元素全部设置为-1
	UnionFindSet(size_t n)
		:_ufs(n, -1)
	{}


private:
	vector<int> _ufs;
};

并查集的合并

并查集合并的步骤:

  • 找到待合并的两个元素的根的下标。
  • 判断它们是否已经在同一个集合,若不在同一集合,则进行以下步骤。
  • 将数据量小的集合往数据量大的集合合并,然后合并两个集合元素,小的集合名称改为大的集合名称。

在每一次查找下标的时候,顺便进行路径压缩。避免路径过长造成效率损失。具体怎么做可以详细看看代码:

// 给一个元素的编号,找到该元素所在集合的名称
int FindRoot(int index)
{
	// 如果数组中存储的是负数,则找到,否则一直继续查找
	int root = index;
	while (_ufs[root] >= 0)
	{
		root = _ufs[root];
	}

	// 路径压缩
	while (_ufs[index] > 0)
	{
		int parent = _ufs[index];
		_ufs[index] = root;
		index = parent;
	}

	return root;
}

void Union(int x1, int x2)
{
	int root1 = FindRoot(x1);
	int root2 = FindRoot(x2);

	// 如果root1==root2,本身就在一个集合,就没有必要合并了
	if (root1 == root2)
		return;

	// 若没有在一个集合,则数据量小的集合往数据量大的集合合并
	if (abs(_ufs[root1]) < abs(_ufs[root2]))
		swap(root1, root2);

	// 将两个集合中元素合并
	_ufs[root1] += _ufs[root2];
	// 将其中一个集合的名称改为另外一个
	_ufs[root2] = root1;
}

统计集合数量

// 统计集合的个数,数组中负数的个数,即为集合的个数
size_t Size()const
{
	size_t count = 0;
	for (auto e : _ufs)
	{
		if (e < 0)
			++count;
	}
	return count;
}

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

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

相关文章

《找对英语学习方法的第一本书》

简 述: 此书写于二十年前&#xff0c;结合我自身情况参照&#xff0c;有了一种理论指导&#xff0c;可在众多学习方法中有效抉择&#xff0c;亦能在不同阶段更换不同策略。本文为读后的一个简要归纳和札记。 文章目录第一章&#xff1a;爱之愈深、误之愈切第二章&#xff1a;我…

李宏毅2022《机器学习/深度学习》——学习笔记(5)

文章目录优化方法CNNCNN和全连接神经网络的区别感受野共享参数CNN和全连接神经网络的总结PoolingCNN流程自注意力机制自注意力机制解决的问题输入是一组向量的例子输入是一组向量时输出的可能自注意力机制核心思想自注意力机制具体细节Self-attention和CNN的关系参考资料优化方…

网络安全之从原理看懂XSS

01、XSS的原理和分类 跨站脚本攻击XSS(Cross Site Scripting)&#xff0c;为了不和层叠样式表(Cascading Style Sheets&#xff0c;CSS)的缩写混淆 故将跨站脚本攻击缩写为XSS&#xff0c;恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页面时&#xff0c…

七周成为数据分析师 | 业务

为什么业务重要&#xff1f; 唯有理解业务&#xff0c;才能建立业务数据模型 一.经典业务分析指标 模型未动&#xff0c;指标先行 如果你不能衡量它&#xff0c;你就无法增长它 指标建立的要点 ①核心指标 ②好的指标应该是比率 ③好的指标应该能带来显著效果 ④好的指…

民办二本程序员阿里、百度、平安等五厂面经,5 份 offer(含真题)

昨天小休&#xff0c;一位高中同学联系了我&#xff0c;说是要请我吃饭&#xff0c;有这种好事&#xff0c;我当然是毫不犹豫的答应了啦&#xff01; 等等...会不会是找我借钱的&#xff1f; 好慌&#xff0c;怎么办&#xff1f;已经答应过去了。 在后面的交谈中&#xff0c;…

Word控件Spire.Doc 【图像形状】教程(12) 如何在C#中旋转word文档上的形状

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【C语言程序设计】实验 3

目录 1. 水仙花数 2. 五位回文数 3. 输入x&#xff0c;计算y 4. 百分制改为等级制 5. 同构数 6. 月份天数 7. 加一天后日期&#xff08;条件&#xff09; 8. 计算服装款&#xff08;条件&#xff09; 1. 水仙花数 【问题描述】输入一个3位正整数&#xff0c;判断该…

数据可视化之基础图表

一 前言 数据图表则是用来表现数据的一类图表&#xff0c;用来帮助用户理解数据。在这类图表中&#xff0c;以三大类图表最为常用 —— 柱状图&#xff08;条形图&#xff09;、折线图、饼图。据非官方统计&#xff0c;数据图表使用率占所有图表的类型的62%。所以&#xff0c;…

Docker之MySQL_GROUP_REPLICATION组复制(MGR)、宕机节点恢复和Spirngboot整合

三台服务器修改hosts文件 vim /etc/hosts追加内容 192.168.1.11 node1 192.168.1.12 node2 192.168.1.13 node3修改hostname vim /etc/hostname重启网络使配置文件生效 systemctl restart network三台服务器拉取MySQL镜像 docker pull mysql:8.0.23创建配置文件夹 …

PDF文档转TXT怎么转?你不知道的几种方法

PDF文档转TXT怎么转&#xff1f;我们经常需要处理PDF文件&#xff0c;根据不同的要求&#xff0c;我们经常需要将PDF文件进行转换&#xff0c;虽然PDF文件相对于其他大多数文件来说体积已经很小了&#xff0c;但是TXT文件会比PDF文件体积更小一些&#xff0c;这样我们不仅可以节…

Python工程师Java之路(w)数据库连接池Druid

概述 初阶数据库访问的步骤是【创建连接>执行SQL>关闭连接】&#xff0c;有如下不足&#xff1a; 1、创建数据库连接会浪费时间 2、大量访问时&#xff0c;频繁 GC 会导致CPU负载过高 3、如果改为不关闭连接&#xff0c;则会长期占用内存对此&#xff0c;引入“缓冲池”…

物联网各类数据如何轻松获取?秘诀就在定制文件推送服务

当前&#xff0c;数字经济已成为我国经济发展的重要驱动力。随着物联网的蓬勃发展&#xff0c;海量数据伴随着终端联网在各行各业涌现&#xff0c;越来越多的企业已然察觉隐藏在数字中的金矿&#xff0c;加入到数字化转型行列中&#xff0c;通过数据挖掘实现精细化运营&#xf…

高蛋白过敏我们该如何缓解?教你几招远离过敏吃喝无忌

许多朋友回应说&#xff0c;吃海鲜.牛肉、羊肉等高蛋白食物会发生过敏反应&#xff0c;要么脸红肿&#xff0c;要么长痘痘。看着他们贪婪的食物&#xff0c;他们只能避免吃真的很痛苦。为什么现在人们的生活条件越来越好&#xff0c;生活环境也显著改善&#xff0c;但过敏性疾病…

USB插座外壳接地的处理和emi,esd考虑

外壳是否接地&#xff0c;从理想电路环境&#xff08;没有干扰&#xff0c;也不释放干扰&#xff09;和电路原理来说&#xff0c;接和不接没有任何差异&#xff0c;也不会影响正常功能。 但是实际的电子产品的工作环境&#xff0c;是一个处于被各种干扰包围的复杂的电磁场环境&…

[附源码]JAVA毕业设计人才库构建研究(系统+LW)

[附源码]JAVA毕业设计人才库构建研究&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

使用icacls命令设置目录及其子目录、文件的所有权限

以前一直使用cacls命令来设置权限&#xff0c;前两天输入这个命令的时候&#xff0c;却发现了一行提示&#xff1a; “注意: 不推荐使用 Cacls&#xff0c;请使用 Icacls。” 如图&#xff1a; 于是研究了一下 Icacls 这个命令。。 先放上微软官方文档&#xff1a; https:/…

单场直播销售额破7亿,11月的抖音带货风向是什么?

双11走过14年&#xff0c;今年的双11有些特别。我们发现&#xff0c;各个平台在交易额战报的发布上都变得更加保守&#xff0c;而无论是天猫还是京东&#xff0c;均首次未公布具体的交易额。在消费市场出现波动的当下&#xff0c;双11正在经历转变&#xff0c;从重视成交额&…

基于遗传算法的二进制图像重建(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f4a5;1 概述 图像分辨率是评价图像成像系统的---项重要技术指标.图像分辨率又分为图像的空间分辨率、灰度分辨率和频谱分辨率等.在实际应用中,受到各种因素的限制,通过现有条件要达到所需…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK9特性讲解】

JDK各个版本特性讲解-JDK9特性 lecture&#xff1a;波哥 一、JDK版本特性 JAVA8 及之前,版本都是特性驱动的版本更新,就是有重大的特性产生,然后进行更新 JAVA9开始,JDK开始以时间为驱动进行更新,以半年为周期,到时即更新,三年出一个长期支持版,其他都是短暂的版本 目前的长期支…

非常好用的C# .Net开源高性能跨平台内网穿透工具FastTunnel 香橙派orangepi

特别适合在家里做个web或者文件服务器之类&#xff0c;还可以用在树莓派&#xff0c;香橙派搭建个服务器&#xff0c;很好用 FastTunnel是什么&#xff1f; FastTunnel是一款高性能跨平台内网穿透工具&#xff0c;使用它可以实现将内网服务暴露到公网供自己或任何人访问。与其…