并查集

并查集(标准并查集、带权并查集、扩展域并查集) 并查集是一种数据结构,用来管理集合之间的关系,可以用来进行判断是否属于同一集合或将不同的集合合并等操作。我们用个生活中的例子来说明一下原本小明家这个集合只有小明,小红家只有小红,那么他们结婚后(合并)就属于一个家庭(一个集合),像这样,通过并查集我们能够合并不同的集合,然后还能快速地查找他们是不是同一个集合。 阅读详情
  • 并查集是由一群集合构成,最开始时所有元素各自单独构成一个集合。
  • 当集合中只有一个元素时,这个集合的代表节点即为该元素,该元素的father也是自己。
  • 使用哈希表来存并查集中所有集合的所有元素的father信息,记为fatherMap。fatherMap中的一条记录所代表的含义是key节点的father为value节点。每个节点都有father信息。集合代表节点的father为本身。
  • 另外还会存储rank信息,该信息只需要集合的代表节点记录,表示该集合中有多少个元素。记为rankMap。
  • 当一个集合中有多个节点时,下层节点的father为上层节点,最上层节点的father指向自己,最上层的节点叫做这个集合的代表节点。
  • 在并查集中,若要查询一个节点属于哪个集合,就是查这个节点所在集合的代表节点是什么。一个节点通过father信息找到最上面的节点,直到该节点的father是其本身停止,这个节点代表了整个集合。
  • 通过一个节点找到所在集合代表节点的过程称为findFather。该过程不仅仅是单纯的查找,还会把整个查找路径压缩,会把经过的所有节点的father置为代表节点。
    在这里插入图片描述
    在这里插入图片描述
  • 经过路径压缩之后,路径上的每个节点下次在找代表节点的时候只需要经过一次移动过程。这是整个并查集结构中最重要的优化。
  • 在并查集中如何进行集合合并
  • 两个集合进行合并操作时,参数是并查集中任意的两个节点,记为a,b。
  • 首先找到a所在集合的代表节点记为aF,然后找到b所在集合的代表节点记为bF。
    • 如果aF==bF,说明a和b本身就在一个集合里,不用合并。
    • 如果aF!=bF,那么根据rankMap中存储的集合元素个数来决定,如果aFrank<bFrank,那么将aF的father置为bF,同时更新bF集合的元素个数记为bFrank+=aFrank,并且在rankMap中删除aF的rank信息;如果aFrank>bFrank,则和上述一样只不过把b换成a;如果aFrank=bFrank,那么aF和bF谁做大集合的代表都可以,但不要忘记更新rankMap。
package advan01;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;
class Element<V>{
		public V value;
		public Element(V value) {
			this.value=value;
		}
}
public class UnionFindSet<V> {
	public HashMap<V,Element<V>> elementMap;
	public HashMap<Element<V>,Element<V>> fatherMap;
	public HashMap<Element<V>,Integer> rankMap;
	public UnionFindSet(List<V>list) {
		elementMap=new HashMap<>();
		fatherMap=new HashMap<>();
		rankMap=new HashMap<>();
		//初始化
		for(V value:list) {
			Element<V> element=new Element<V>(value);
			elementMap.put(value, element);
			fatherMap.put(element,element);//每个元素自称一个集合
			rankMap.put(element, 1);
		}
	}
	public Element<V> findHead(Element<V> element){
		Stack<Element<V>> path=new Stack<>();
		//寻找集合的代表节点
		while(element!=fatherMap.get(element)) {
			path.push(element);
			element=fatherMap.get(element);
		}
		//压缩路径 对路径上经过的节点更改父节点
		while(!path.isEmpty()) {
			fatherMap.put(path.pop(), element);
		}
		return element;
	}
	public boolean isSameSet(V a,V b) {
		if(elementMap.containsKey(a)&&elementMap.containsKey(b))
			return findHead(elementMap.get(a))==findHead(elementMap.get(b));
		return false;
	}
	public void union(V a,V b) {
		if(elementMap.containsKey(a)&&elementMap.containsKey(b)) {
			Element<V> aF=findHead(elementMap.get(a));
			Element<V> bF=findHead(elementMap.get(b));
			if(aF!=bF) {
				Element<V> big=rankMap.get(aF)>=rankMap.get(bF)?aF:bF;
				Element<V> small=big==aF?bF:aF;
				fatherMap.put(small, big);
				rankMap.put(big, rankMap.get(aF)+rankMap.get(bF));
				rankMap.remove(small);
			}
		}
	}
}
C++ 并查集算法 并查集简介 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。 ... 阅读详情

相关推荐

扩展域并查集 & 带权并查集

扩展域并查集通过拆分域来表示复杂关系,逻辑直观且易于理解。虽然空间开销较大,但在处理复杂关系问题时非常高效。带权并查集通过维护权值来表示节点之间的关系,路径压缩和权值更新确保了高效的关系推导。虽然逻辑稍复杂,但代码简洁且高效,适合处理类似食物链的问题。

Lostgreen的博客 1866

数据结构(八):并查集详解 (多图+动图)

数据结构(八):并查集详解 (多图+动图)

ReadyGo!!!的博客 2万+

并查集及带权并查集

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。xxx和yyy是亲戚,yyy和zzz是亲戚,那么xxx和zzz也是亲戚。如果xxxyyy是亲戚,那么xxx的亲戚都是yyy的亲戚,yyy的亲戚也都是xxx的亲戚。带权并查集是一种用于解决带权无向图中连通性问题的数据结构。它是并查集的扩展,包括点带权和边带权。它除了记录元素之间的关系外,还可以记录元素的权重。在点带权中,我们使用n。

bhdwyl的博客 1004

【高级数据结构】并查集

前面讲解了并查集的基本应用—一处理集合问题。在这些基本应用中,点之间只有简单的归属关系,而没有权值。如果在点之间加上权值,并查集的应用会更广泛。如果读者联想到树这种数据结构,会发现并查集实际上是在维护若干棵树。并查集的合并和查询优化,实际上是在改变树的形状,把原来“细长”的,操作低效的大量“小树”,变为“粗短”的、操作高效的少量“大树”。如果在原来的“小树”上,点之间有权值,那么经过并查集的优化变成“大树”后,这些权值的操作也变得高效了。定义一个权值数组dd[]d,把节点iii。

Antonio915的博客 1万+

分布式光纤传感(DFOS)DTS/DAS/DSS 三合一:10公里管线监测实战与数据解读

本文详细介绍了分布式光纤传感(DFOS)技术在10公里管线监测中的实战应用,通过DTS(温度)、DAS(振动)、DSS(应变)三合一系统,实现对管线健康状态的立体感知。文章涵盖工程部署、数据采集、多物理量数据融合及噪声抑制等关键技术,展示了如何通过一根光纤完成复杂监测任务,显著提升管线安全性和维护效率。

weixin_29168153的博客 315

基于STM32 HAL库的L298N四驱电机PWM调速与方向控制实战

本文详细介绍了基于STM32 HAL库驱动L298N电机控制板实现四驱小车PWM调速与方向控制的实战方法。涵盖硬件连接、GPIO与定时器配置、PWM生成、方向控制逻辑及电源管理等核心内容,并提供代码优化与常见问题解决方案,帮助开发者快速实现高效稳定的电机控制。

jump7的博客 222

万字长文,并查集(Union Find)精讲及应用实例

并查集(Union Find):一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。不交集指的是一系列没有重复元素的集合。合并(Union):将两个集合合并成一个集合。查找(Find):确定某个元素属于哪个集合。通常是返回集合内的一个「代表元素」。简单来说,并查集就是用来处理集合的合并和集合的查询。并查集中的「集」指的就是我们初中所学的集合概念,在这里指的是不相交的集合,即一系列没有重复元素的集合。

白话机器学习 8496

scratch绘制四个三角形 2024年6月中国电子学会 图形化编程 scratch编程等级考试二级真题和答案解析

​ scratch绘制四个三角形 一、题目要求 2024年6月电子学会图形化编程Scratch等级考试二级真题 1、准备工作 1.保留默认角色小猫; 2.添加背景Stars。 2、功能实现 1 .隐藏角色小猫,设置画笔裙始位置为(0,0),画笔颜色为黄色,画笔的粗细为5; 2. 点击绿旗,绘制如下图所示图形,三角形的边长为50。 二、案例分析 1、角色分析 角色:小猫 2、背景分析 背景:Stars背景 3、前期准备 1. 保留默认的小猫不变 ​

青少年编程学习指导 1716

算法与数据结构——并查集、种类并查集和带权并查集

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

qq_56639722的博客 3072

系统架构设计师重难点知识脑图

大家都知道现在的软考自从变成机考后,越来越难了,教程上的内容不仅全还细,几乎任何内容都有可能考,出题老师主打一个出其不意,比如2024年5月考试,连UML时序图的片段都考,这。软件工程、系统架构基础知识、系统质量属性与架构评估、软件架构的演化和维护、信息系统架构设计、层次式架构设计、云原生架构设计、面向服务架构设计、安全架构设计、大数据架构设计等。所以对于教程上的任何知识点,都需要去记忆。因此我在这里制作了一个脑图,将所有知识点集中在一个脑图中,通过首词组句法,记忆背诵,通过一个个的展开节点,加强记忆。

分享技术干货和灵感、推荐新书和好玩的项目、分享Java面试题 1100

【Android面试八股文】Handler如果没有消息处理是阻塞的还是非阻塞的?Looper 为什么要使用死循环?Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

Handler如果没有消息处理是阻塞的还是非阻塞的? Looper 为什么要使用死循环? Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

字节卷动 758

带权并查集 & 种类并查集

带权并查集就是在维护集合关系的树中添加边权的并查集,这样做可以维护更多的信息。 在对并查集进行路径压缩和合并操作时,这些权值具有一定属性,即可将他们与父节点的关系,变化为与所在树的根结点关系。 也就是说,权值代表着**当前节点与父节点的某种关系(即使路径压缩了也是这样)**,通过两者关系,一般的并查集,维护的是具有连通性、传递性的关系,例如**亲戚的亲戚是亲戚**。但是,有时候,我们要维护另一种关系:**敌人的敌人是朋友**。种类并查集就是为了解决这个问题而也可以将同一棵树下两个节点的关系表示出来。

SZTU_ZJB的博客 1991

微信小程序 - 最新详细实现“全局实时监听页面发生跳转“ 当页面跳转后立即捕捉并触发某个操作或调用处理函数,小程序整个项目无时无刻只要路由发生变化改变了就能监听,时刻检测页面URL变化(获取路由数据)

微信小程序,vue2,vue3,监听路由,如何监听路由发生变化,如何watch监听路由,怎么全局监听页面发生变化,实现当页面路由发生变化时执行一个函数,当路由变化时执行一些操作执行一段代码,怎么监听路由变化时触发一个函数,监听页面变化,页面间的跳转如何监听,页面跳转时怎么拿到路由及参数,页面路由变化时拿到参数和url,使用watch监听路由变化,页面跳转后怎么触发事件,怎么监听页面跳转,监听页面跳转并拿到路由url路径,小程序怎么全局定义一个专门监听路由的函数,小程序怎么无时无刻实时监听路由页面跳转,监听当

🏆 前端领域优质创作者 4474

并查集,扩展域并查集,带边权并查集详解,OJ练习,详细代码

一看就会系列

EQUINOX1的博客 2867

吊打原版YOLOv8!ASF-YOLO多尺度融合+注意力机制实战解析(遥感/医疗/质检均适用)

ASF-YOLO融合YOLOv8的创新目标检测框架摘要 ASF-YOLO是针对小目标检测优化的先进框架,采用三重特征编码器和尺度序列融合技术增强多尺度特征提取能力。核心创新包括: 三重特征编码器(TPE)融合跨层级信息 尺度序列特征融合(SSFF)模块通过3D卷积处理多尺度信息 通道-位置注意力机制(CPAM)聚焦关键特征区域 Zoom_cat模块实现自适应多尺度特征融合 该框架特别适用于医学影像、遥感检测等小目标密集场景,通过动态特征权重调整显著提升检测精度。关键技术实现包含多尺度特征统一、3D卷积序列处

FJN110的博客 527

大数据平台符合信创(CDH国产化代替)详细方案(企业内部不外传方案)

信创旨在实现信息技术产业的自主可控,减少对外部技术的依赖,从而提升国家信息安全和经济发展的自主性。在此背景下,中国对信创提出了更高的要求,以期在激烈的市场竞争中占据有利地位。信创不仅关乎技术层面的创新,更涉及到产业链条的整合与优化。它要求从基础硬件、操作系统、数据库、中间件等各个层面实现国产替代,构建完整的信息技术生态体系。尤其是在做国企项目时,就有硬性要求使用符合信创(国产代替)。在信创背景下,符合要求的产品必须具备自主可控、安全可靠以及性能卓越等核心特点。

大模型大数据攻城狮的专栏 3509

并查集提高——种类并查集(扩展域并查集)

本文介绍了种类并查集(反集)的原理与应用。通过两道例题(P1892团伙问题和P2024食物链问题),展示了如何利用扩展的并查集结构处理复杂关系。核心思想是将敌对关系转化为朋友关系,通过建立反集(i+n节点)来维护传递性。在团伙问题中,将朋友直接合并,敌人则与对方的反集合并;在食物链问题中,采用三倍空间分别表示同类、猎物和天敌关系。文章详细阐述了具体实现流程,并提供了AC代码,帮助读者理解如何通过并查集维护多类型关系,同时指出统计根节点时的注意事项。

2504_90509331的博客 1015

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构:并查集,种类并查集,带权并查集

最近学了并查集,写篇博客巩固一下~有时候,我们并不关心数据之间的前后关系,也不关心数据的层次关系。一些确定元素只是单纯的聚集在一起,这样的元素聚集体被称为集合。当希望知道某个数据是否存在一个集合中,或者两个元素是否在同一个集合中时,就需要使用一些集合数据结构来维护集合元素之间的关系。而并查集就是一个维护集合的数据结构。

ffqws_的博客 1172

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

并查集和带权并查集及分类并查集

并查集是一种集并集查询于一体的数据结构,它的时间复杂度是Oαn)),阿尔法函数是阿克曼函数的反函数,返回值一般不超过3,数很大时一般不超过7,因此并查集的均摊时间复杂度接近O(1)。一般用来判断两个点是否相通,也可以用来判环,当相通的两个点连接时就会出现环,环的长度是两个点分别到根结点的路径之和加一。

gaomuchen_120309的博客 1044

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

浅谈并查集

一些简单种类的并查集

qq_43052183的博客 1218

并查集进阶

并查集进阶 文章目录并查集进阶绪论普通并查集初始化搜索合并带权并查集初始化搜索合并种类并查集例题HDU3047(种类并查集)HDU3635(带权并查集)POJ1988(带权并查集)POJ2912(种类并查集)POJ1456(普通并查集) 绪论 我本来以为并查集是一种很简单的数据结构,但是实在是被kuangbin的专题虐的死去活来,故在此总结一下 并查集目前有三部分: 普通并查集,带权并查集,种类并...

Dawn-K の Blog 858

种类并查集(并查集难点)

种类并查集概念例题 概念 一.什么是种类并查集? 顾名思义就是把一个集合中的元素根据他们不同的关系进行分类与合并。朋友的朋友就是朋友(普通并查集) ,但敌人的敌人也是朋友(维护这种关系就是种类并查集了)。例如:有一伙人他们要拔河(分成两个队),如果小a与小b是敌对关系,那么就不能在一个队,如果小a与小c是朋友,那么他们就在一个队;(朋友的朋友就是朋友,敌人的敌人也是朋友。 ) 种类并查集的作用就是不让两个有敌对关系的人在同一个队伍 二.种类并查集的应用 把朋友放在同一集合里,把敌人放另一集合里。放一起会打架

qq_47549346的博客 4360

【并查集】 带权并查集详解

一.引入 并查集实际上是一颗由若干个树构成的森林,而如果还需要储存边的权值,则需要额外用一个数组d记录每个结点和其父节点的权值 这个思路其实很简单,但是因为路径压缩会改变点与点的连接关系,路径压缩后,点的父节点变为了根节点,所以需要更新d数组 二.查询函数写法 更新权值在查询操作的同时进行 int root_find(int x){ if(x==pre[x]) return x; int root=root_find(pre[x]); d[x]+=d[pre[...

Qiuker_jl的博客 2488
上一篇: 岛屿数量
下一篇: LRU缓存机制
鯉鱼
博客等级 码龄9年 6粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值