初始并查集

目录

一.并查集的介绍

二.并查集核心函数介绍

1.查找函数Find()

2.合并函数Union()


一.并查集的介绍

并查集(Disjoint-Set Union,简称并查集)是一种用来管理集合的数据结构。它主要支持两种操作:

1.查找(Find):确定一个元素属于哪个子集。这通常通过找到集合中的代表元素(也称为根节点或代表节点)来实现。
2.合并(Union):将两个子集合并成一个集合。这通常是通过将一个集合的根节点连接到另一个集合的根节点来实现的。

并查集通常用于解决与集合分割连接相关的问题,例如:

》动态连通性问题:判断图中两个节点是否连通。
》最小生成树算法中的最小边问题:按权重顺序连接图中的边,但要避免形成环。
》社交网络中的好友关系:查找两个用户是否属于同一个社交圈。

通常情况下,并查集通过树结构实现。每个集合都有一个代表元素,而这些集合之间的关系由树的连接来表示。基本的实现方法有两种:

1.基于树的并查集:每个集合用一棵树来表示,其中根节点代表该集合的代表元素。合并操作时,将一棵树的根节点连接到另一棵树的根节点上。这种方法的问题在于树可能会变得不平衡,导致操作的复杂度增加。
2.基于数组的并查集:将集合表示为数组,数组的索引表示元素,数组的值表示元素所属的集合(或者是其父节点)。合并操作时,将其中一个集合的根节点指向另一个集合的根节点。这种方法相对简单,但也容易导致树的深度过大。

并查集的性能取决于其实现方式以及路径压缩和按秩合并等优化技术的使用。

二.并查集核心函数介绍

1.查找函数Find()

查找函数的作用是通过一个节点,往上去查找它的祖先,当某两个节点的祖先相同,那么证明它们两个在同一个集合里面,按照传统的来讲,就是有血缘关系。

下面是循环实现代码:

int Find(int x)
{while(pre[x]!=x)x=pre[x];//继续往上找祖先 return x;//循环出来,当前x为传入元素的祖先		
} 

例如,通过这个函数我们传入4进去,可以找到4的祖先2,在找到它们两的祖先1。

但是面对一个庞大的集合,那么查找都要花费很多的时间,那么我们怎么更快的找到祖先呢?

我们设想一下,反正我们的目的是找祖先,那么我们何须注意2和4这类的上下级关系呢,我们直接将2,3,4,5,6,7和祖先1连接在一起不就行了。

这就用到了我们的路径压缩。

下面是实现代码:

int Find(int x)     				
{if(pre[x] == x) return x;		      return pre[x] = Find(pre[x]);	
}

2.合并函数Union()

合并函数的实现其实非常简单,原理就是找到需要合并的两个节点的的祖先,将某一个的祖先接在另一个祖先上面,他们祖先都接一起了,那么这两个节点当然合并了。

实现代码:

void Union(int x,int y)
{int fx=Find(x),fy=Find(y);if(fx!=fy)//如果祖先不一样则需要合并 pre[fx]=fy;
}

那么现在又遇到一个问题,需要合并的两个节点所处的集合高度(规模)不一定相同。

将大树接到小树上,总体树的高度就会变为4,反之,树的高度就会变为3,我们当然是需要我们树的高度越低越好,那么一个怎么实现小树接在大树上呢?

我们可以提前用一个数组表示某个树的高度,合并时按照小树接在大树上面,当接入后,这个树的高度增加。

下面是优化代码:

void Union(int x,int y)
{int fx=Find(x),fy=Find(y);if(fx==fy) return;if(height[fx]>height[fy]) pre[fx]=fy;//按照高度,矮的接到高的上 else if(height[fx]<height[fy]) pre[fy]=fx;else{pre[fy]=fx;//如果一样高 height[fx]++;//将接入的一方+1 }
}

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

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

相关文章

LabVIEW叶片厚度远程监控

LabVIEW叶片厚度远程监控 随着网络技术的高速发展&#xff0c;远程监控广泛应用在各个领域。本文介绍了一种基于LabVIEW的植物叶片厚度远程监控系统&#xff0c;旨在实现对植物生长状况的精准监测和分析。 该系统利用LabVIEW软件开发工具&#xff0c;通过TCP网络协议实现数据…

一文读懂「LM,Large Model」大模型

有时候我们经常说行业大模型&#xff0c;医疗大模型&#xff0c;开源大模型&#xff0c;甚至用「产品大模型」的固定结构去称呼一个模型&#xff0c;例如百度的文心一言大模型&#xff0c;但是文心一言其实是大语言模型&#xff0c;大模型和大语言模型&#xff0c;差别就两个字…

如何手机搜中国大学mooc答案?推荐9个搜题软件和学习工具 #经验分享#其他

以下软件拥有强大的搜索功能&#xff0c;能够快速找到与题目相关的资料和答案&#xff0c;让大学生们更容易理解和掌握知识点。 1.Google翻译 可提供简体中文和另外 100 多种语言之间的互译功能&#xff0c;可让您即时翻译字词、短语和网页内容 Google的免费翻译服务 2.大鱼…

如何在docker中访问电脑上的GPU?如何在docker中使用GPU进行模型训练或者加载调用?

如何在docker中访问电脑上的GPU&#xff1f;如何在docker中使用GPU进行模型训练或者加载调用&#xff1f; 其实使用非常简单&#xff0c;只是一行命令的事&#xff0c;最主要的事配置好驱动和权限。 docker run -it --rm --gpus all ycj520/centos:1.0.0 nvidia-smi先看看 st…

基于YOLOv8深度学习的水稻叶片病害智能诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

C语言指针学习 之 指针变量

前言&#xff1a; 通过学习我们认识了什么是指针&#xff0c;就让我们一起来分析一个例子。 #include<stdio.h> int main() {int a100;int * hz; hz &a;printf("a%d \n",a);printf("*hz%d \n",*hz);return 0; }a100 *hz100 PS C:\csay\cyuya…

Facebook的社交影响力:用户行为解析与趋势

在当今数字时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交平台之一&#xff0c;其社交影响力愈发显著。本文将深入分析Facebook的社交影响力&#xff0c;解析用户行为&#xff0c;同时探讨当前和未来的社交趋势。 社…

2024-02-01 Unity Shader 开发入门4 —— ShaderLab 语法

文章目录 1 材质和 Shader1.1 Unity Shader 和 Shader 的区别1.2 Unity 中的材质和 Shader1.3 创建材质1.4 创建 Shader 2 ShaderLab 的基本结构2.1 什么是 ShaderLab2.2 ShaderLab 的基本结构 3 Shader 名称4 Shader 属性4.1 Shader 属性的作用4.2 Shader 属性的基本语法4.3 数…

【Git】03 图形化工具

文章目录 一、右击菜单二、打开仓库三、可视化所有分支历史四、总结 一、右击菜单 二、打开仓库 三、可视化所有分支历史 四、总结 图形化工具了解一下&#xff0c;要懂得在哪里能找到。

pdmodel从动态模型转成静态onnx

1.下载项目 git clone https://github.com/jiangjiajun/PaddleUtils.git 2.新建两个新的文件夹 第一个文件夹放两个必要文件 第二个文件夹可以设置为空&#xff0c;用来存放转换后的模型 如图&#xff1a; 3.在终端运行 python paddle/paddle_infer_shape.py --model_dir …

AI大模型专题:大模型安全与伦理研究报告2024

今天分享的是AI大模型系列深度研究报告&#xff1a;《AI大模型专题&#xff1a;大模型安全与伦理研究报告2024》。 &#xff08;报告出品方&#xff1a;腾讯研究院&#xff09; 报告共计&#xff1a;76页 大模型具有不同于传统模型的特点和优势 第一&#xff0c;大模型和传统…

来看看Tomcat和Web应用的目录结构

在前面两篇大致了解了Tomcat的架构和运行流程&#xff0c;以及Tomcat应用中的web.xml。 聊一聊Tomcat的架构和运行流程&#xff0c;尽量通俗易懂一点-CSDN博客 来吧&#xff0c;好好理解一下Tomcat下的web.xml-CSDN博客 那接下来&#xff0c;再看看Tomcat的目录&#xff0c;…