算法与数据结构(九)--并查集

并查集是一种树型的数据结构,并查集可以高校地进行如下操作:
*查询元素p和元素q是否在同一组
*合并元素p和元素q所在的组

一.并查集结构

并查集也是一种树型结构,这种树的要求比较简单:
1.每个元素都唯一的对应一个结点;
2.每一组数据中的多个元素都在同一颗树中;
3.一个组中的数据对应的树和另外一个组中的数据对应的树之间没有任何联系;
4.元素在树中并没有子符级关系的硬性要求。

简单说就是同一组的元素可以看成是一棵树。

 二.并查集API设计

三.并查集的实现 

1.UF(int N)构造方法实现

【1】初始情况下,每个元素都在独立的分组中,所以,初始情况下,并查集中的数据默认分为N个组;
【2】初始化数组eleAndGroup
【3】将eleAndGroup数组的索引看做是每个结点存储的元素,把eleAndGroup数组每个索引的值看做是该结点所在的分组,那么初始化情况下,i索引处存储的值就是i

 2.union(int p,int q)合并方法实现

1.如果p和q已经在同一个分组中,则无需合并
2.如果p和q不在同一个分组中,则只需要将p元素所在的所有元素的组标识符修改为q元素所在组的标识符即可
3.分组数量-1

四.优化union算法--UF_Tree

1.UF_Tree算法优化

为了提升union算法的性能,我们需要重新设计find方法和union方法的视线,此时我们现需要对我们的之前数据结构中的eleAndGourp数组的含义进行重新设定:
1.我们仍然让eleAndGroup数组的索引作为某个结点的元素;
2.eleAndGroup[i]的值不再是当前结点所在的分组标识,而是该结点的父结点;

 2.API设计

3.find(int p)查询方法实现

【1】判断当前元素p的父节点eleAndGroup[p]是不是自己,如果是自己则证明已经是根结点了;
【2】如果当前元素p的父结点不是自己,则让p=eleAndGroup[p],继续找父结点的父节点,知道找到根结点为止;

 4.union(int p,int q)合并方法实现

1.找到p元素所在树的根结点
2.找到q元素所在树的根结点
3.如果p和q已经在同一个树中,则无需合并;
4.如果p和q不在同一分组中,则需要将p元素所在树根结点的父节点设置为q元素的根结点即可;
5.分组数量减一

五.路径压缩--UF_Tree_Weighted

UF_Tree中最坏情况下union算法的时间复杂度为O(N^2),其最主要的问题在于最坏情况下,树的深度和数组的大小一样,如果我们能够通过一些算法让合并时,生成的树的深度尽可能的小,就可以优化find方法。
之前我们在union算法中,合并树的时候将任意的一颗树连接到另外一颗树,这种方法是比较暴力的,如果我们把并查集中每一棵树的大小记录下来,然后再每次合并树的时候,把较小的树连接到较大的树上,就可以减小树的深度。

只要我们保证每次合并,都能把小树合并到大树上,就能够压缩合并后新树的路径,这样就能提高find方法的效率。为了完成这个需求,我们需要另外一个数组来记录存储每个根结点对应的树中元素的个数,并且需要一些代码调整数组中的值。

UF_Tree_Weighted API设计

 

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

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

相关文章

linux:shell ==命令sh无效

问题: 如题 解决办法: 将更换为或者-eq

优美而高效:解决服务器通信问题

题目背景 在这个问题中,我们面临着一幅服务器分布图。图中的每个单元格可能有服务器(标记为1)或者没有(标记为0)。我们的任务是找出能够与至少一台其他服务器进行通信的服务器数量。 算法思路 为了解决这个问题&…

无涯教程-Python机器学习 - Stochastic Gradient Boosting函数

它也称为梯度提升机。在下面的Python食谱中,我们将通过使用pima Indians糖尿病数据集上的 sklearn 的 GradientBoostingClassifier 类来创建随机梯度Boostingensemble模型进行分类。 首先,导入所需的软件包,如下所示: from pandas import read_csv from sklearn.model_select…

国民八路参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.

国民八路参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022&#xff0…

SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

在上一篇文章,讲了服务的注册和发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbonrestTemplate,另一种是feign。在这一篇文章…

Python requests实现图片上传接口自动化测试

最近帮别人写个小需求,需要本地自动化截图,然后图片自动化上传到又拍云,实现自动截图非常简单,在这里就不详细介绍了,主要和大家写下,如何通过Pythonrequests实现上传本地图片到又拍云服务器。 话不多说&a…

Kali 软件管理

kali 更新 1. 查看发行版本 ┌──(root㉿kali)-[~] └─# lsb_release -a No LSB modules are available. Distributor ID: Kali Description: Kali GNU/Linux Rolling Release: 2023.2 Codename: kali-rolling2. 查看内核版本 ┌──(root㉿kali)-[~] └─…

正则常见问题及解决方案

使用正则处理问题的基本思路。有一些方法比较固定,比如将问题分解成多个小问题,每个小问题见招拆招:某个位置上可能有多个字符的话,就⽤字符组。某个位置上有多个字符串的话,就⽤多选结构。出现的次数不确定的话&#…

突破连接壁垒,火山引擎边缘云网络的先行之路

在万物互联时代,信息不局限于人与人之间的交流,大量的机器设备也需要进行信息交流。就在去年,我国率先迎来了“物超人”的历史性时刻,即物联网连接数超越了人联网连接数。边缘云的发展进入到“黄金十年”。 “要致富,…

JavaFX 加载 fxml 文件

JavaFX 加载 fxml 文件主要有两种方式,第一种方式通过 FXMLLoader 类直接加载 fxml 文件,简单直接,但是有些控件目前还不知道该如何获取,所以只能显示,目前无法处理。第二种方式较为复杂,但是可以使用与 fx…

【Java】自动取款机ATM案例

目录 1. 封装数据2. 欢迎界面3. 实现开户功能4. 生成卡号5. 登录功能6. 展示用户操作界面7. 查询账户8. 存款9. 取款10. 转账11. 修改密码12. 注销 用户输入密码,如果密码校验通过,就会进入ATM机的主操作界面:有查询、取款、存款、转账等业务…

Docker容器与虚拟化技术:Docker compose部署LNMP

目录 一、理论 1.LNMP架构 2.背景 3.Dockerfile部署LNMP 3.准备Nginx镜像 4.准备MySQL容器 5.准备PHP镜像 6.上传wordpress软件包 7.编写docker-compose.yml 8.构建与运行docker-compose 9.启动 wordpress 服务 10.浏览器访问 11.将运行中的 docker容器保存为 doc…

智能设计师的崛起:探寻智元兔AI设计师的神奇之旅

AI绘图是指利用人工智能技术来生成或改善绘图作品的方法和工具。通过使用深度学习和生成对抗网络等算法,人工智能可以学习和模仿艺术家的创作风格,生成逼真的艺术作品。 智元兔-AI设计师是一款基于人工智能设计工具,利用机器学习和深度学习技…

什么是ChatGPT水印,ChatGPT生成的内容如何不被检测出来,原理什么?

太长不看版 1. 什么是ChatGPT水印? ChatGPT水印是AI以伪随机方式生成的独特tokens序列。该序列用来作为水印,以区分AI生成内容和人类原创内容。 2. 如何规避ChatGPT水印? 一种规避方法是使用其他AI模型改写ChatGPT生成的文本。这会破坏水…

启动线程方法 start ()和 run ()有什么区别

在Java中,线程可以通过调用start()方法或者直接调用run()方法来执行。这两种方式有着重要的区别: start() 方法:当你调用线程的start()方法时,它会使线程进入就绪状态,等待系统调度。系统会为该线程分配资源,并在合适的时机执行线程的run()方法。实际上,start()方法会启…

大数据(二)大数据行业相关统计数据

大数据(二)大数据行业相关统计数据 目录 一、大数据相关的各种资讯 二、转载自网络的大数据统计数据 2.1、国家大数据政策 2.2、产业结构分析 2.3、应用结构分析 2.4、数据中心 2.5、云计算 一、大数据相关的各种资讯 1. 据IDC预测&#xff0…

SpringBoot 读取配置文件的值为 Infinity

1.配置信息 appid:6E212341234 2.获取方式 Value("${admin}")private String admin; 获取到结果 Infinity 3.修改方案 配置信息上加号 appid:‘6E212341234 yml中使用[单引号]不会转换单引号里面的特殊字符,使用""[双…

vue3使用canvas实现图层的移动、缩放、旋转等其他编辑操作

一、Canvas的点击区域检测以及如何监听Canvas上各种图形的点击事件 1、利用数学的力量 一些简单有规则的图形,比如矩形,椭圆,多边形......我们可以使用一些数学函数来计算判断。 这种方式非常棒,当你的画布上没有大量的图形时,他可能是非常快的。 但是这种方式很难处理…

JOJO的奇妙冒险

JOJO,我不想再做人了。 推荐一部动漫 JOJO的奇妙冒险 荒木飞吕彦创作的漫画 《JOJO的奇妙冒险》是由日本漫画家荒木飞吕彦所著漫画。漫画于1987年至2004年在集英社的少年漫画杂志少年JUMP上连载(1987年12号刊-2004年47号刊),2005年后在集英…

全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢

展示突破性创新技术,共话行业发展趋势。8月25日,全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下,由浙…