数据结构——不相交集(并查集)

devtools/2024/9/25 2:57:44/

一、基本概念

关系:定义在集合S上的关系指对于a,b∈S,若aRb为真,则a与b相关

等价关系:满足以下三个特性的关系R称为等价关系

(1)对称性,aRb为真则bRa为真;

(2)反身性,aRa为真;

(3)传递性,aRb为真,bRc为真,则aRc为真

等价类:等价类E是集合S的子集,其中E内的任意两个元素构成等价关系

不相交集:将集合S分为若干个等价类,等价类之间不包含相同的元素,对于x∈S,x只属于S中一个等价类。由于子集之间不包含相同的元素,将这样的集合称为不相交集。不相交集中主要基本操作是查找find和合并union,故常称为并查集。find查找给定元素所在的等价类,union将不在同一个等价类中的两个元素归并到一个等价类中,即将两个等价类归并为一个新的等价类。

 二、不相交集的实现

①线性表,线性表的第i个元素保存其所处等价类的名称,find时间复杂度O(1),union时间复杂度O(N)

②采用树状结构,用一棵树表示一个并查集,每个并查集由树根唯一标识,则不相交集就构成一篇森林。判断结点处于哪一个并查集,需寻找其所在树的树根,因此采用双亲表示。在数组s[i]中,s[i]存储结点i的父结点的下标值,根结点则存特殊的-1。find就是向上找直到树根,时间复杂度O(logN),union就是把一棵树作为另一颗树的子树,时间复杂度为O(1)

完成find的时间正比于从结点到根结点的路径长度,最坏的情况是O(N)[树退化为线性结构],而find的性能一定程度上受到union的影响,因为在union过程中不考虑树的结构。改进思想是避免树增高,有两种思路:按规模归并,按高度归并,按高度归并可以保证find时间是对数级别。

 

 最理想的情况是每一棵树的高度为2,只有根结点以及孩子结点,这时find的效率最高,尽管第一个改进能够提高find的效率,但是当两颗树高度接近时还是会使树的高度增加,引入第二个提高效率的方法:在find的时候进行路径压缩,即将路径上所有结点的父结点改为根结点。

 Find(14)   return  parent[14]=Find(12)  0

Find(12)  return  parent[12]=Find(11)  0

Find(11)   return parent[11]=Find(9)  0

Find(9)    return  parent[9]=Find(3)   0

Find(3)  parent[0]=-15<0 return 0

 

三、不相交集的应用

 1.生成迷宫

将迷宫看成是M*N矩阵,每一个小块视为一个元素,左上角为入口,右下角为出口。块与块之间的连通关系属于等价关系,因此迷宫生成可以用并查集来实现。初始时块与块之间由墙分隔,通过随机拆墙的方法,逐渐连通迷宫中的区域,直至入口和出口连通时迷宫形成。

2.最近公共祖先问题

 

采取后序遍历的原因:先遍历两个结点,再遍历到其公共祖先

并查集的作用:每棵子树的根视作等价类的标志,当两个结点同属一棵树即同属一个等价类时,就找到了最近公共祖先。 


http://www.ppmy.cn/devtools/43360.html

相关文章

数据结构与算法之线性表01

数组是一种线性数据结构&#xff0c;把相同数据类型的元素存储在连续的内存空间中&#xff0c;数组的索引&#xff08;元素在数组中的位置&#xff09;从0开始。 一、常用操作&#xff1a; 1、初始化 # 给定初始值 arr:list[int] [0] * 5 nums:list[int] [1, 2, 3, 4, 5] …

Leetcode 力扣95. 不同的二叉搜索树 II (抖音号:708231408)

给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null…

GO语言 linux部署

https://blog.csdn.net/wangye135/article/details/136177171 一、简述 1. 可以直接在服务器上运行编译好的二进制文件&#xff0c;不需要在服务器上下载语言环境。 2. 内置运行时环境&#xff1a;可执行文件中内置了运行时环境&#xff0c;包括垃圾回收、调度器等&#xff…

从计划到行动:BI项目中PDCA闭环思维如何转化为实践?

在当今快节奏的商业环境中&#xff0c;项目管理的质量直接影响到企业的运营效率和竞争力。为了确保项目能够高效、顺利地进行&#xff0c;并达到预期目标&#xff0c;企业需要采用系统化的管理方法来指导项目的实施。PDCA&#xff08;Plan-Do-Check-Act&#xff09;循环&#x…

芯片固定uv胶有什么优点?

芯片固定uv胶有什么优点&#xff1f; 芯片固定UV胶具有多种优点&#xff0c;这些优点使得它在半导体封装和芯片固定等应用中成为理想的选择。以下是芯片固定UV胶的一些主要优点&#xff1a; 固化速度快&#xff1a;UV胶在紫外线照射下能迅速固化&#xff0c;通常在几秒到几十秒…

QT C++ 模型视图结构 QTableView 简单例子

在Qt中&#xff0c;MVC模式被广泛使用于各种用户界面框架中&#xff0c;包括Qt的模型视图结构。Qt的模型视图结构是基于MVC模式设计的&#xff0c;其中包括了Model、View和Delegate三个部分。 QTableView是Qt模型视图结构中的一种视图&#xff0c;它用于以表格形式显示数据。 …

Java如何将tif格式图片转为jpg格式图片

在Java中&#xff0c;将TIFF&#xff08;.tif&#xff09;格式的图片转换为JPEG&#xff08;.jpg&#xff09;格式的图片&#xff0c;通常需要使用图像处理库&#xff0c;如Apache Commons Imaging&#xff08;之前称为Sanselan&#xff09;或Java Advanced Imaging (JAI)。但是…

当下sprign boot最火最全的经典面试题

基础概念 什么是Spring Boot&#xff1f;Spring Boot的核心优势是什么&#xff1f;Spring Boot与传统的Spring MVC项目相比&#xff0c;有哪些显著的区别&#xff1f;Spring Boot如何实现“约定优于配置”原则&#xff1f;请举例说明。解释Spring Boot中的Starter POMs概念及其…