并查集(高级数据结构)-蓝桥杯

news2024/9/25 17:12:07

一、并查集

  • 并查集(Disioint Set):一种非常精巧而实用的数据结构·用于处理不相交集合的合并问题。

  • 用于处理不相交集合的合并问题。

  • 经典应用:

  • 连通子图。

  • 最小生成树Kruskal算法。

  • 最近公共祖先。

二、应用场景

有n个人,他们属于不同的帮派。
已知这些人的关系,例如1号、2号是朋友,1号、3号也是朋友,那么他们都属于一个帮派。
问有多少帮派,每人属于哪个帮派。

有n个人一起吃饭,有些人互相认识认识的人想坐在一起,而不想跟陌生人坐。
例如A认识B,B认识C,那么A、B、C会坐在一张桌子上。
给出认识的人,问需要多少张桌子。
  • 用并查集可以很简洁地表示这个关系。

三、并查集的操作

  • 初始化

  • 定义s[ ]是以结点i为元素的并查集。

  • 初始化:令s[i]=i (联想:某人的号码是i,他属于帮派s[i])。

  • 代码:

  • 合并

  • 加入第一个朋友关系(1,2):

  • 在并查集s中,把结点1合并到结点2,也就是把结点1的集1改成结点2的集2。

  • 加入第二个朋友关系(1,3):

  • 查找结点1的集,是2,递归查找元素2的集是2;把元素2的集2合并到结点3的集3。此时,结点1、2、3都属于一个集。

  • 加入第三个朋友关系(2,4):

  • 查找结点1的集,是2,递归查找元素2的集是2;把元素2的集2合并到结点3的集3。此时,结点1、2、3都属于一个集。

  • 代码:

  • 查找

  • 查找元素的集,是一个递归的过程,直到元素的值和它的集相等,就找到了根结点的

集。

  • 代码:

  • 这棵搜索树,可能很细长,复杂度O(n),变成了一个链表,出现了树的“退化”现象。

  • 总结

  • 代码:

四、有多少个集(帮派) ?

  • 如果s[i] = i,这就是一个根结点,是它所在的集的代表(帮主)。统计根结点的数量,就是集的数量。

  • 复杂度:

  • 查找find_set()、合并merge_set()的搜索深度是树的长度,复杂度都是O(n)。性能较差,不是高级数据结构应有的复杂度。

  • 复杂度的优化:

  • 能优化吗? 能 目标:优化之后,复杂度≈O(1)。

  • 查询的优化(路径压缩):

  • 查询程序find_set():沿着搜索路径找到根结点,这条路径可能很长。

  • 优化:沿路径返回时,顺便把i所属的集改成根结点。下次再搜,复杂度是O(1)。

  • 代码:

  • 优化前后代码对比:

  • 路径压缩总结:

  • 路径压缩通过递归实现。

  • 整个搜索路径上的元素,在递归过程中,从元素i到根结点的所有元素,它们所属的集都被改为根结点。

  • 路径压缩不仅优化了下次查询,而且也优化了合并,因为合并时也用到了查询。

五、蓝桥杯真题(1135号)


六、蓝桥杯真题(1135号)


七、蓝桥杯真题(185号)


1.暴力法

  • 1≤N≤100000

  • 每读入一个新的数,就检查前面是否出现过,每一次需要检查前面所有的数。共有n个数,每个数检查O(n)次,总复杂度O(n^3),超时。

  • 暴力法1

  • 暴力法2


2.查重,hash或set()

  • 改进,用hash。定义vis[]数组,vis[i]表示数字i是否已经出现过。这样就不用检查前面所有的数了,基本上可以在O(1)的时间内定位到。

  • 或:直接用set判断是否重复,也是O(1)。


3.改进:记忆法

  • 本题特殊要求:“如果新的Ai仍在之前出现过,小明会持续给Ai加1,直到Ai,没有在A1~Ai-1中出现过。”这导致在某些情况下,仍然需要大量的检查。

  • 以5个6为例:A[ ]={6,6,6,6,6}。

  • 第一次读A[1]=6,设置vis[6]=1。

  • 第二次读A[2]=6,先查到vis[6]=1,则把A[2]加1,变为a[2]=7;再查vis[7]=0,设置vis[7]=1。检查了2次。

  • 第三次读A[3]=6,先查到vis[6]=1,则把A[3]加1得A[3]=7; 再查到vis[7]=1,再把A[3]加1得A[3]=8,设置vis[8]=1; 最后查vis[8]=0,设置vis[8]=1。检查了3次。

......

  • 每次读一个数,仍需检查O(n)次,总复杂度O(n^2)。

  • 本题用Hash,在特殊情况下仍然需要大量的检查。

  • 问题出在“持续给Ai加1,直到Ai没有在A1~Ai-1中出现过”。

  • 也就是说,问题出在那些相同的数字上。当处理一个新的Ai时,需要检查所有与它相同的数字。

如果把这些相同的数字看成一个集合,就能用并查集处理。

  • 用并查集s[i]表示访问到i这个数时应该将它换成的数字。

  • 以A[ ]={6,6,6,6,6}为例。初始化set[i]=i。

  • 图(1)读第一个数A[0]= 6。6的集set[6]= 6。紧接着更新set[6] = set[7] = 7,作用是后面再读到某个A[k]=6时,可以直接赋值A[k] = set[6]= 7。

  • 图(2)读第二个数A[1]=6。6的集set[6]=7,更新A[1]= 7。紧接着更新set[7]= set[8]= 8。如果后面再读到A[k]= 6或7时,可以直接赋值A[k]= set[6]= 8或者A[k]= set[7]=8。


  • 只用到并查集的查询,没用到合并。

  • 必须是“路径压缩”优化的,才能加快查询速度。没有路径压缩的并查集,仍然超时。

  • 复杂度O(n)

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

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

相关文章

Kafka漏洞修复之CVE-2023-25194修复措施验证

Kafka漏洞修复之CVE-2023-25194修复措施验证前言风险分析解决方案AdoptOpenJDK Zookeeper Kafka多版本OpenJDK安装切换Zookeeper安装Kafka安装与使用其他Kafka消息发送流程Linux配置加载顺序参考链接前言 场景介绍 Kafka最近爆出高危漏洞CNNVD-202302-515,导致Apa…

LeetCode刷题复盘笔记—一文搞懂贪心算法之56. 合并区间(贪心算法系列第十四篇)

今日主要总结一下可以使用贪心算法解决的一道题目,56. 合并区间 题目:56. 合并区间 Leetcode题目地址 题目描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间…

QXlsx(访问Excel)

再Qt中已经有了QAxObject来访问Excel,但访问的是微软的com,只能访问正版的Excl中的 .xls//xlsx ,而且使用起来及其不方便(本人亲测)。 在这里使用QXlsx,能更简单的访问Excel数据,但QXlsx这个类并没有在Qt Creator中&a…

《MySQL学习》 MySQL优化器选择如何选择索引

一.优化器的选择逻辑 建表语句 CREATE TABLE t (id int(11) NOT NULL AUTO_INCREMENT,a int(11) DEFAULT NULL,b int(11) DEFAULT NULL,PRIMARY KEY (id),KEY a (a),KEY b (b) ) ENGINEInnoDB;往表中插入10W条数据 delimiter ;; create procedure idata() begindeclare i in…

目标检测三大数据格式VOC,YOLO,COCO的详细介绍

注:本文仅供学习,未经同意请勿转载 说明:该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在:待上传 目录 目标检测常见数据集总结 V0C数据集(Annotation的格式是xmI) A. 数据集包含种类: B. V0C2007和V0C2012的区别…

QT学习记录散件

fromLocal8Bit() qt中fromLocal8Bit()函数可以设置编码。 因为QT默认的编码是unicode,不能显示中文的 而windows默认使用(GBK/GB2312/GB18030) 所以使用fromLocal8Bit()函数,可以实现从本地字符集GB到Unicode的转换,从…

32-Golang中的map

Golang中的map基本介绍基本语法map声明的举例map使用的方式map的增删改查操作map的增加和更新map的删除map的查找map的遍历map切片基本介绍map排序map的使用细节基本介绍 map是key-value数据结构,又称为字段或者关联数组。类似其它编程语言的集合,在编程…

2023美赛ABCDEF思路汇总

注:以下每个题思路仅是个人所想所做,不代表他人。由于时间仓促完成这么多,难免有不足之处,还请谅解。 文章目录A题第一大问第二大问B题第一问第二问第三问C题第一问第二问第三问第四问D题第一问第二问第三问第四问第五问E题第一问…

#Paper Reading# Language Models are Unsupervised Multitask Learners

论文题目: Language Models are Unsupervised Multitask Learners 论文地址: https://life-extension.github.io/2020/05/27/GPT技术初探/language-models.pdf 论文发表于: OpenAI 2019 论文所属单位: OpenAI 论文大体内容: 本文主要提出了GPT-2(Gener…

Visual Studio 2022: 增加对虚幻引擎的支持

自 Visual Studio 2022 发布以来,我们一直专注于为游戏和大型项目开发人员提供一系列生产力和性能改进。今天,我们很高兴与大家分享下一组专门用来提高虚幻引擎开发效率的功能。我们听到并看到了来自你(我们的游戏开发人员)的大量…

Spring MVC之 一次请求响应的过程

Spring MVC 会创建两个容器,其中创建Root WebApplicationContext 后,调用其refresh()方法会触发刷新事件,完成 Spring IOC 初始化相关工作,会初始化各种 Spring Bean 到当前容器中我们先来了解一个请求是如何被 Spring MVC 处理的…

2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享 很多时候,我们都想将一些文件或文本传送给别人,或者跨端传递一些信息,但是我们又不…

自抗扰控制ADRC之三种微分跟踪器TD仿真分析

目录 前言 1 全程快速微分器 1.1仿真分析 1.2仿真模型 1.3仿真结果 1.4结论 2 Levant微分器 2.1仿真分析 2.2仿真模型 2.3仿真结果 3.非线性跟踪微分器——韩教授 3.1仿真分析 3.2小结 4.总结 前言 工程上信号的微分是难以得到的,所以本文采用微分器…

重磅 | 小O软件新品【鲸鱼地图】发布

千呼万唤始出来.......,小O系列软件又添新品【鲸鱼地图】!!! 2023年新年伊始,小O就投入到新品研发工作中,秉承“发现地理价值”理念,为用户提供更加好用、易用的地图软件产品,经过春…

【C语言】编程初学者入门训练(完结)

文章目录1. 实践出真知2. 我是大V3. 有容乃大4. 小飞机5. 缩短2进制6. 十六进制转十进制7. printf的返回值8. 成绩输入输出9. 学生基本信息输入输出10. 字符圣诞树11. ASCII码12. 出生日期输入输出13. 按照格式输入并交换输出14. 字符转ASCII码15. 计算表达式的值16. 计算带余除…

Java特性之设计模式【策略模式】

一、策略模式 概述 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略…

Matlab数学建模常用算法及论文插图绘制模板资源合集

最近有很多朋友咨询我关于Matlab论文插图绘制方面的问题。 问了一下,这些朋友中,除了写博士论文的,大部分都是要参加美赛的。 这让我突然想起,自己曾经为了水论文,购买过一批Matlab数学建模的资料。 想了想&#xf…

EMIF转AXI-Lite接口

最近想用DSP对FPGA里的IP进行配置,感觉没有什么特别好的办法。如果能像Zynq一样直接有能够配置外设的AXI-Lite接口就好了。EMIF是DSP的外部存储器访问接口,支持对存储器的同步或异步访问。在我现有的条件下,利用EMIF接口配置FPGA内部的寄存器…

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 一、竞赛时间 共计360分钟。 竞赛任务书内容 2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 A模块基础设施设置/安全加固(200分) A-1&…

如何安全存储企业文件?

信息时代的到来,企业文件的安全存储越来越被企业管理者看重。常见的企业文件存储是借用第三方工具,如企业网盘,这种方法性价比高,而且也比较安全,被各大企业所喜爱。市面上的企业网盘类工具不胜枚举,该如何…