首页 > 其他分享 >并查集基础版

并查集基础版

时间:2023-12-05 17:25:04浏览次数:24  
标签:... return 复杂度 查集 基础 查询 root

并查集

(byd打到一半没保存直接关了乆乆乆)

并查集是一种数据结构,它可以用一个优秀的时间复杂度(路径压缩后接近\(O(1)\))来维持多个集合之间的关系,并进行查找和合并。

查找操作

我们可以定义一个并查集数组\(p[i]=j\)表示\(i\)的父亲(并查集实际是把一个一个的集合看做树来处理)是\(j\)。

初始化时令\(p[i]=i\)(这表示\(i\)为所在树的根)。

对于每一次查询\((i,j)\)是否在同一集合,我们可以递归的查找\(i,j\)两点所在树的根,如果根相同则表示\(i,j\)在同一集合内。

找根函数:

int root(int x){
	if(fr[x]==x)return x;
	return fr[x]=root(fr[x]);
}

合并操作

如何将\(x,y\)所在树合并呢?直接令p[x]=y可以吗?

不难发现,如果这样写会导致

令人发出"WA"的感叹

这就使得\(x\)与原集合之间的所属关系收到破坏。

解决方法是合并时令p[root(x)]=root(y)

画出图就是

解决后

这样就完美解决了。

路径压缩优化。

让我们简单思考一下,这样写会有问题么?

假如洛谷模版题中有类似这样一组数据

10000 200000
1 1 2
1 2 3
1 3 4
1 4 5
...
...
...
...
1 10000 10001
2 10000 10001
2 10000 10001
...
...
...

让我们分析一下,按照之前的合并操作,这棵树最后会变成

退化后

它退化成了一根链!在这种情况下,查询操作的复杂度就变成了\(O(n)\)。

\(10^5\)这种数量级的查找显然是遭不住的,那应该怎么优化呢?

这就要路径压缩了。我们先思考这样一个问题,查询操作的复杂度在什么时候最小呢?

显然,当树类似这样一个形状时

最优情况下的树

查询操作时间复杂度就变成了\(O(1)\)。

那应该如何实现呢?

不难发现,对于一棵树上的每一棵节点,他的位置并不重要,重要的是他的根是哪个点。所以,我们在查询的时候可以直接把这个点的父亲直接修改为根,由于是递归查询,如此一来他所在这一根枝条上的所有点都直接连在了根下面。

代码实现:

int root(int x){//并查集找根函数 
	if(f[x]==0)return x;
	return f[x]=root(f[x]);
}//“=”赋值也是有返回值的,返回值即为赋的值

基本并查集用法就这么多了,再往下就是进阶版本的并查集了orz

标签:...,return,复杂度,查集,基础,查询,root
From: https://www.cnblogs.com/lmq742643/p/17877710.html

相关文章

  • Tekton Trigger TriggerBindings 基础
    TriggerBindings概述TriggerBinding的功能主要用于将Event中特定属性的值传递给TriggerTemplate上的参数从而完成其resourcetemplates中模板资源的实例化。注意:Trigger使用参数名称将TriggerBinding参数与TriggerTemplate参数匹配。为了传递信息,绑定中使用的参数名称必须与......
  • docker基础命令
    From:https://docker-curriculum.com/ 一、docker常见的命令从远程Pullimage:$dockerpullbusybox Listimages:$dockerimages DockerRun:# Whenyoucallrun,theDockerclientfindstheimage(busyboxinthiscase),loadsupthecontainerand......
  • Tekton Trigger EventListener 基础
    EventListener概述EventListener是一个Kubernetes对象,用于侦听Kubernetes集群上指定端口上的事件。它公开了一个可寻址接收器,用于接收传入事件并指定一个或多个Triggers。sink是一个Kubernetes服务,在专用Pod内运行sink逻辑。每个Trigger又允许您指定一个或多个Trigge......
  • 【Python/数据库】SQLAlchemy基础操作
    一、SQLAlchemy——创建表#ORM#1.Class-Obj#2.创建数据库引擎#3.将所有的Class序列化为数据表#4.ORM操作-CRUD(增删改查操作的简称)1.创建一个class#create_table.pyfromsqlalchemy.ext.declarativeimportdeclarative_baseBase=declarative_base......
  • Tekton Trigger 基础
    TektonTrigger概述TektonTriggers是一个Tekton组件,它允许您从各种来源的事件中检测和提取信息,并基于该信息确定地实例化和执行TaskRuns和PipelineRuns。Tekton触发器还可以将从事件中提取的信息直接传递给TaskRuns和pipelinerun。在Kubernetes集群上安装TektonTriggers作为Te......
  • Tekton Trigger Interceptors 基础
    Interceptors概述Interceptor是针对特定平台的的事件处理器,在TriggerBinding之前运行。它允许您执行有效负载过滤、验证(使用秘密)、转换、定义和测试触发条件,以及实现其他有用的处理。一旦事件数据通过Interceptor,它就会在将有效负载数据传递到TriggerBinding之前转到Trigger......
  • java基础语法-pageage-构造方法-继承-多态
    java中的包-package包:包中有很多的类,根据类的功能不同,我们可以创建不同的包。包的主要功能:包的主要功能:用于分类管理包的基本语法package包的路径路径与路径之间使用点隔开:package.fatherlujing.sonlujing在一个文件中,可以没有包,或者一个包。但是不能出现两个包。......
  • linux基础命令--文件管理类
    1.cat命令简介:打印文件到屏幕上格式cat[-AbeEnstTuv][--help][--version]fileName参数说明:-n或--number:由1开始对所有输出的行数编号。-b或--number-nonblank:和-n相似,只不过对于空白行不编号。-s或--squeeze-blank:当遇到有连续两行以上的空白行,就代换为一......
  • 计算机基础之数据表示
    1.为什么计算机内部采用二进制表示信息?答:主要有3个方面的原因(1)二进制系统只有两个基本符号:0和1所以,它的基本符号少,易于用稳态电路实现。(2)二进制的编码、记数、运算等规则简单。(3)二进制中的0和1与逻辑命题的“真”和“假”的对应关系简单,为计算机中实现逻辑运算和程序中的逻辑判......
  • Java基础故障处理工具
    适用场景:生产环境由于可视化工具侵入系统,带来资源占用、安全问题或者规模较小未部署可视化监控平台,此时要使用基础命令行工具;给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括但不限于异常堆栈、虚拟机运行日志、垃圾......