【数据结构】并查集(路径压缩)

在这里插入图片描述

文章目录

  • 并查集
    • 1.朴素版本
    • 2.路径压缩
    • 3.按秩合并
    • 4.启发式合并
    • 5.练习题


并查集

1.朴素版本

1.
并查集解决的是连通块的问题,常见操作有,判断两个元素是否在同一个连通块当中,两个非同一连通块的元素合并到一个连通块当中。
并查集和堆的结构类似,都是采用数组存储下一个节点的下标的方式来抽象成一棵树,只不过堆的数组对应的是一棵二叉树,而并查集的数组对应的是森林,可以抽象成很多的树,并且每棵树也不一定是二叉树,任意形状均可。
初始化数组时,数组存储内容均为自己的下标,表示每个节点的父节点都是自己,previous译为先前的,在这里正好表示某一个元素的父节点元素下标是多少。
合并两个节点,实际上是合并这两个节点分别对应的根节点,这里可能会有人有疑问,为什么不合并非根节点呢?如果你合并非根节点,让非根节点指向另一个非根节点,那么2棵树直接变成三棵树了。并查集合并算法的性能瓶颈其实是在找根的操作上,如果一棵树的高度是N,那么找根的时间复杂度其实就是O(N)了,这样的效率实际上是很低的,所以后面会进行三种方式的优化。
统计并查集中树的个数其实也比较简单,只需要统计根节点是自己的节点个数即可。

在这里插入图片描述

2.路径压缩

如果我们能够缩短查找根节点过程中的路径,那么合并两棵树的效率就会很高,如下图所示,如果路径压缩到一层,那么查找根的时间复杂度就接近于O(1),所以路径压缩这种方式效率是很高的。
下面的图其实主要想给大家展示路径压缩的好处,但在我们的代码里面,左边这种单分支情况的树一定是不会出现的,因为每次任意两棵树合并时,在查找根期间都会做路径压缩,从节点个数为1开始进行任意树的合并,一定是不会出现左边这种4个节点串起来的情况的,所以下面的图仅仅是为了展示路径压缩的优点而已。

在这里插入图片描述
下面是递归版本的压缩路径
在这里插入图片描述
下面是循环版本的压缩路径

在这里插入图片描述

3.按秩合并

秩的英文是rank,rank还有排名等意思,但在并查集这里秩其实表示的是树的高度,当两棵树合并时,为了让合并后的效率更高,我们通常选择将树高度小于等于另一棵树的树主动合并到较高的那棵树上去,这样有一个好处,树整体的高度可能不会改变或者是增加1,这两种情况都是比较好的。
那么如何维护树的高度呢?我们只需要一个rnk数组即可,在合并的时候判断两棵树的高低,将较小的树合并到较大树上,同时维护rnk数组,如果两棵树高度相等,合并操作无所谓,例如x合并到y上,那么y的高度需要+1,x的高度不变。时间复杂度近似于O(logN)。

在这里插入图片描述

4.启发式合并

启发式合并与按秩合并较为相似,只不过启发式合并是按照树中节点个数的多少来合并的,在合并时尽量让节点个数较少的树合并到节点个数较多的树上,这种优化方式的时间复杂度和按秩合并是近似的,都是O(logN)。如何维护树的节点个数大小呢?只需要维护一个sz数组即可。
这两种方式虽然没有路径压缩那么优秀,但其实在oj里面从消耗时间上来看,其实三种优化方式都是差不多的,因为题目所给数据构成的树可能不是很高,所以O(logN)渐进于O(1)

在这里插入图片描述

5.练习题

547.省份数量

该题给出了邻接矩阵,我们只需要遍历上半部分,将相连的城市合并到一个连通块当中,最后统计并查集中连通块的总数即为省份的数量。
压缩路径,按秩合并,启发式合并,在下面这道题中你都可以试试,优化效果还是很明显的

在这里插入图片描述

990.等式方程的可满足性

为了让代码看起来优雅一些,用了递归的写法,但时间复杂度不太理想,可能因为栈调用太深了,栈的建立和销毁也耗费了大部分时间,我用循环版的压缩路径试过,3ms即可AC,效果还是比较理想的

在这里插入图片描述

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

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

相关文章

Unity 图片不改变比例适配屏幕

Unity 图片不改变比例适配屏幕 前言项目场景布置代码编写添加并设置脚本效果 前言 遇到一个要让图片适应相机大小,填满屏幕,但不改变图片比例的需求,记录一下。 项目 场景布置 代码编写 创建AdaptiveImageBackground脚本 using System.C…

ConcurrentModificationException异常原因,解决方法,线程安全的单例模式

异常简介 ConcurrentModificationException(并发修改异常)是基于java集合中的 快速失败(fail-fast) 机制产生的,在使用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了增删改,…

Fink CDC数据同步(二)MySQL数据同步

1 开启binlog日志 2 数据准备 use bigdata; drop table if exists user;CREATE TABLE user(id INTEGER NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL DEFAULT ,birth VARCHAR(20) NOT NULL DEFAULT ,gender VARCHAR(10) NOT NULL DEFAULT ,PRIMARY KEY(id) ); ALTER TA…

刘知远团队大模型技术与交叉应用L6-基于大模型文本理解和生成介绍

介绍 NLP的下游运用可以分为:NLU(理解)和NLG(生成) 信息检索:NLU 文本生成:NLG 机器问答:NLUNLG 大模型在信息检索 大模型在机器问答 大模型在文本生成 信息检索-Information Retrieval (IR) 背景 谷歌搜索引擎目前同时集成了…

NLP入门系列—Attention 机制

NLP入门系列—Attention 机制 Attention 正在被越来越广泛的得到应用。尤其是 [BERT]火爆了之后。 Attention 到底有什么特别之处?他的原理和本质是什么?Attention都有哪些类型?本文将详细讲解Attention的方方面面。 Attention 的本质是什…

Mac M1使用PD虚拟机运行win10弹出“内部版本已过期立即安装新的windows内部版本”

一、问题 内部版本已过期立即安装新的windows内部版本 二、解决 1、如图所示打开zh-CN目录 C:\windows\system32\zh-CN找到licensingui.exe文件 将该文件重命名为licensingui_bak.exe 2、修改完成效果如下 (1)但操作中发现,需要TrustedIns…

闲的无聊,做了几个微信红包封面,才发现好像没啥用,索然无味

这几天闲的无聊,正好也快要过年了,心血来潮搞几个微信红包封面。 折腾了大半天,又是ps,又是开通微信红包封面平台。 弄了100多个图,选出来50个,最后就提交了1个到微信平台,也通过审核了。 最…

【Kafka】服务器Broker与Controller详解

这里写自定义目录标题 Broker概述Broker总体工作流程Broker重要参数 Controller为什么需要Controller具体作用数据服务Leader选举选举流程脑裂问题羊群效应触发leader选举 Broker 概述 Kafka服务实例,负责消息的持久化、中转等功能。一个独立的Kafka 服务器被就是…

vue2 对接 海康摄像头插件 (视频WEB插件 V1.5.2)

前言 海康视频插件v.1.5.2版本运行环境需要安装插件VideoWebPlugin.exe,对浏览器也有兼容性要求,具体看官方文档 对应下载插件 去海康官网下载插件 里面有dome等其他需要用到的 地址: 安装插件 打开下载的文件里的bin文件 安装一下Video…

修改Vim编辑器的缩进和显示行数

一、Vim编辑器的缩进和显示行数 1.指令 sudo vi /etc/vim/vimrc2.插入内容 set tabstop4 set shiftwidth4 set nu 注意输入的格式,前后不要留空格 tabstop是输入按下tab缩进4个 shiftwidth是批量缩进4个 nu是显示行数

革命性的写作:MDX 让你的 Markdown 全面动起来

1. MDX MDX 是一种标记语法,它结合了 Markdown(一种流行的文本到 HTML 的转换工具)和 JSX(React 中用于描述 UI 组件的语法扩展)。MDX 允许你在 Markdown 文档中直接写入 JSX,这意味着你可以在 Markdown 内…

IPv6协议讲解

IPv6协议讲解 IPv6是互联网协议的第六版(Internet Protocol Version 6),它用于在互联网上路由数据包,旨在替代IPv4,它提供了更多的IP地址和改进的网络功能。IPv6是为了应对互联网快速发展带来的挑战而设计的,它的引入不仅解决了地…

【教学类-40-08】A4骰子纸模制作8.0(2.97CM嵌套骰子表格相连 一页7个 油墨打印A4铅画纸)

作品展示(一页7个骰子,表格连在一起,一行一个(2嵌套)) 背景需求: 制作三嵌套盒子并实践后,感觉套起来很紧,还是用2嵌套的铅画纸做骰子比较好, https://blog…

代码随想录算法训练营|day24

第七章 回溯算法 77.组合代码随想录文章详解总结 77.组合 以n5,k3为例 (1)for循环遍历&#xff0c;递归选择符合要求的值加入path&#xff0c;len(path)k时&#xff0c;返回 statrtIndex保证每次递归取到的值不重复 剪枝&#xff1a;i<n-(k-len(path))1 后续需要k-len(pat…

政安晨的AI笔记——示例演绎OpenAI的ChatGPT与DALL·E提示词总原则(并融合创作一副敦煌飞天仙女图)

ChatGPT是由OpenAI开发的一种基于大规模预训练的语言生成模型。它建立在GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的基础上&#xff0c;通过大量的无监督学习和生成式任务训练来学习语言的概念和模式。 ChatGPT的原理是基于Transformer模型。Transfo…

shell命令以及运行原理 | 权限

Shell命令原理剖析 shell命令以及运行原理&#x1f4a6;Linux权限的概念&#x1f4a6;什么是权限❔Linux下有哪些权限身份❔Linux中文件属性解析 shell命令以及运行原理&#x1f4a6; Linux严格意义上说的是一个操作系统&#xff0c;我们称之为 “核心&#xff08;kernel"…

AS-V1000 视频监控平台产品介绍:客户端功能介绍(一)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2平台服务器配置说明 二、软件概述 2.1 客户端软件用途 2.2 客户端功能 三、客户端功能说明 3.1 登陆和主界面 3.1.1登陆界面 3.1.2登陆操作 3.1.3主界面 3.1.4资源树 3.2 视频预览 3.2.1视频预览界面 3.2.…

京东微前端框架MicroApp简介

一、MicroApp 1.1 MicroApp简介 MicroApp是由京东前端团队推出的一款微前端框架,它从组件化的思维,基于类WebComponent进行微前端的渲染,旨在降低上手难度、提升工作效率。MicroApp无关技术栈,也不和业务绑定,可以用于任何前端框架。 官网链接:https://micro-zoe.gith…

获取真实 IP 地址(一):判断是否使用 CDN(附链接)

一、介绍 CDN&#xff0c;全称为内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是一种网络架构&#xff0c;旨在提高用户对于网络上内容的访问速度和性能。CDN通过在全球各地部署分布式服务器节点来存储和分发静态和动态内容&#xff0c;从而减少…

【Linux系统化学习】进程替换

目录 进程程序替换 替换原理 ​编辑替换函数 函数解释 命名理解 函数使用 execl execlp execv execvp 调用其它程序 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个…