首页 > 其他分享 >学习笔记 - 并查集

学习笔记 - 并查集

时间:2024-10-20 20:44:44浏览次数:8  
标签:int 查集 笔记 查询 学习 fa 祖先 find

本人实力不济,如有错误或建议及补充,请指出

1.定义

并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。
顾名思义,并查集支持两种操作:

  • 合并(Union):合并两个元素所属集合(合并对应的树)
  • 查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合

并查集在经过修改后可以支持单个元素的删除、移动。

(注:这两段文字均源于OI wiki

2.实现

我们首先设置一个数组fa代表i的父亲是fa[i]

2.0 初始化

我们假设每个节点的父亲刚开始都是自己,即:

int fa[N];
void init(){
for(int i=1;i<=n;i++) fa[i]=i;
}

2.1 查询自己的祖先(find函数的实现)

2.1.1 朴素实现

顾名思义,X先查询自己的父亲Y,Y再查询自己的父亲是Z……直到最高的一辈,即F查询到自己的父亲是F。
此时F就是X的祖先。

int find(int x)
{
	if(fa[x]!=x) return find(fa[x]);//不是祖先,找它的父亲
	else return x;//找到了祖先,返回
}

2.1.2 路径压缩

但考虑极端情况,朴素算法的并查集构成的树是一条链式的,时间复杂度是O(n)。

再回归定义,我们只需要该树的根节点就够了,所以此时可以考虑路径压缩

我们可以把每个结点直接连接到根节点。

代码实现:

int find(int x)
{
	if(fa[x]!=x) return fa[x]=find(fa[x]);//去找祖先,将找到的祖先设为自己的父亲(辈分乱了啊喂)
	else return x;
}

除了第一次查询时间复杂度为O(n),后续几次查询均为O(1)

(谁家好人费怎么大劲造个并查集结果只查询一次)

2.2 合并集合(Union函数)

为什么不将函数名取为union呢,因为union是C++中的联合体(一种关键字就是了)。

由于路径压缩已经介绍了,这里就不提供朴素实现了

void find(int x,int y)
{
	int fax=find(x),fay=find(y);//查询X,Y的祖先
	fa[fay]=fax;//将Y的祖先的父亲设为X的祖先
}

3.拓展阅读

  • [并查集 - OI Wiki]

标签:int,查集,笔记,查询,学习,fa,祖先,find
From: https://www.cnblogs.com/AC-13-13/p/18487850

相关文章

  • openwifi学习-日程记录(全)
    网址:https://github.com/open-sdr/openwifiOpenwifi:openwifi与linux的驱动部分源码和linux系统。Openwifi-hw:openwifi的FPGA部分源码,是硬件部分,也是lowmac部分。Openofdm:openwifi的基带部分源码,也是运行在FPGA中,最终集成到openwif-hw项目中,也算是openwif-hw的一部分(ip),在这里单......
  • 算法笔记-字符串算法集合(未完)
    这里有一些别样的学习思路。KMP用途模式串匹配过程我们分解\(O(nm)\)的算法过程。如图,红色竖线包括的为目前匹配成功的部分,对于下一位\(i\):首先,如果成功匹配,那么匹配长度加一。否则,我们考虑失配情况。我们会将\(S\)串的匹配部分左端点向右移动一位,然后\(T\)串......
  • 红外对射传感器计次(江科大stm32学习笔记)
    本篇文章主要完成红外对射传感器计次的案例,为江科大stm32学习后的笔记记录。硬件方面如图所示为本次使用的红外对射传感器,根据相关说明书可知:模块槽中无遮挡时,接收管导通,模块DO输出低电平,遮挡时,DO输出高电平;且有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。如图所示,①......
  • 光敏电阻控制蜂鸣器(江科大stm32学习笔记)
    首先,选择模块化编程,使代码结构更加的清晰,整洁,便于更改。此处需要对蜂鸣器部分,光敏电阻传感器部分进行模块化编程。电路原理图对蜂鸣器以及光敏电阻传感器的电路原理图进行介绍。如图所示为蜂鸣器的电路原理图:采用三级管进行驱动,当PNP的基级引脚接低电平时,蜂鸣器启动,高电平......
  • 计算机网络笔记搜集
    网络体系结构概念与功能网络:网样的东西或者网站系统计算机网络:是一个将分散的、具有独立功能的计算机系统,通过通信设备和线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。计算机网络的功能:数据通信、资源共享、分布式处理(hadoop平台)、提高可靠性、负载均衡...发......
  • 10月阅读笔记1
    在这个月,我有幸阅读一本名为代码大全2的书籍,这是我为它写的第一篇阅读笔记。《代码大全2》是SteveMcConnell的杰作,它被誉为软件开发领域的里程碑式著作。我认为这本书的文字详实、实用,深度剖析了软件设计、编码实践、代码质量和团队协作的各个方面,更是每个程序员不可多得的学习......
  • 2024-2025-1 20241308 《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标 <门电路组合电路,逻辑电路冯诺依曼结构CPU,内存,IO管理嵌入式系统,并行结构物理安全>作业正......
  • 2024-2025-1 20241417 《计算机基础与程序设计》第四周学习总结
    2024-2025-120241300《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第四周作业)这个作业的目标门电路,组合电路,逻......
  • 2024-2025-1 20241423 《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里2024-2025-1计算机基础与程序设计第四周作业)这个作业的目标计算机科学概论(第七版)第4章,第5章,《C语言程序设计》第3章并完成云班课测试作业正文...本博客链接教材学习内......
  • 线段树分治学习笔记
    前置知识:线段树(只需要了解其结构)支持撤销的数据结构,如可撤销并查集,可持久化数据结构等。线段树分治是什么一种离线算法,用于处理假如某些信息会在某个时间段出现,求某个时刻的信息并。常见的离线算法还有CDQ分治,考虑一下这两个算法的区别。CDQ分治:对于每个操作,考虑其对后面询......