【算法】最小生成树—Prim算法与Kruskal算法

Prim算法和Kruskal算法都是解决最小生成树问题的经典算法。最小生成树是原图的最小连通子图,它包含原图的全部结点,且保持图连通的所有边代价和最小。一个连通图可能有多个最小生成树。

一、Prim算法

含义

Prim算法,也被称为普里姆算法,是图论中的一种算法,主要用于在加权连通图中搜索最小生成树。这意味着通过Prim算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。
主要思想:从某个顶点开始,不断选择与当前生成树相连的最小权值的边,将其对应的顶点加入到生成树中,直到所有顶点都加入到生成树中为止

算法步骤

(1)初始状态:U={u0},TE={}。其中,u0是顶点集合 V中的某一个顶点。
(2)在所有u属于U,U属于V-U的边(u,v)属于E中找一条权值最小的边(u0,v0),将这条边加进集合TE中,同时将此边的另一顶点v0并入U。
这一步骤的作用是在边集E里找一条两个顶点分别在集合 U和V-U中且权值最小的边,把这条边添加到边集 TE 中,并把这条边上不在U中的那个顶点加入到U中。
13
(3)如果U=V,则算法结束;否则重复步骤(2)。

图解

在这里插入图片描述

一、Kruskal算法

含义

Kruskal算法是一种用来查找最小生成树的算法,它使用的贪心准则是从剩下的边中选择不会产生环路且具有最小权值的边加入到生成树的边集中。
主要思想:先对图中的所有边按照权值进行从小到大的排序,然后从小到大依次选取边,若这条边连接的两个顶点不在同一个连通分量中,则将其加入生成树中,否则舍弃,直到生成树中包含所有顶点或者所有边都已遍历完

算法步骤

1、将图中的所有边按照权值从小到大进行排序。
2、初始化一个空的最小生成树。
3、依次遍历排序后的边,判断当前边的两个顶点是否在同一个连通分量中。如果不在同一个连通分量中,则将该边加入最小生成树中,并将这两个顶点合并到同一个连通分量中。如果已经在同一个连通分量中,则跳过该边,继续遍历下一条边。
4、重复步骤3,直到最小生成树中包含了所有的顶点,或者所有的边都已经遍历完毕。

图解

在这里插入图片描述

三、Prim算法和Kruskal算法的区别

1、时间复杂度
Prim算法的时间复杂度为O(V^2),其中V为顶点的个数;
而Kruskal算法的时间复杂度为O(ElogE),其中E为边的个数。在E远大于V的情况下,Kruskal算法更加高效。

2、实现方式
Prim算法可以使用邻接矩阵或邻接表来表示图,并且需要使用堆来维护当前生成树与剩余顶点之间的边的权重。
Kruskal算法可以使用并查集来判断加入的边是否形成回路。

3、适用场景
Prim算法适用于稠密图,即边的数量接近于顶点数量的平方;
而Kruskal算法适用于稀疏图,即边的数量接近于顶点数量的线性。

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

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

相关文章

基于移动端的食堂助餐在线点餐配送系统 uniapp微信小程序

本文从管理员、老人、配送员、食堂商家的功能要求出发,养老助餐管理系统小程序中的功能模块主要是实现老人、配送员、食堂商家、食堂大厅、预约选座、餐号信息、美食信息、美食订单、订单信息、订单配送、订单评价、老人食堂、下单信息、饮食分析。经过认真细致的研…

C语言可以干些什么?C语言主要涉及哪些IT领域?

C语言可以干些什么?C语言主要涉及哪些IT领域? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家…

我在争什么?

本来想写一下2024项目部人员该怎么干,还没有写出来,大家内部就先动起来。针对现有情况做了分析: 作为项目人员(实施,运维) 需要有一定自我认识 认识清楚公司要什么? 认识清楚我自己要什么&…

内网安装redis+部署redis-cluster集群

一、安装redis redis安装包下载地址: https://download.redis.io/releases/ 1.1 解压编译并创建数据目录 tar xzvf redis-6.2.10.tar.gz -C /usr/local/ cd /usr/local/ mv redis-6.2.10/ redis cd /usr/local/redis/ make #编译 …

Springboot整合SSE实现实时消息推送

SSE详细介绍传送门:SSE实时消息推送 简单描述一下SSE推送在实际项目中应用的常见场景 1,项目页面中有消息通知板块,当信息有变化时,只有手动刷新页面,才会看到最新的数据,这里可以采用SSE技术实时推送最新…

Docker技术概论(1):Docker与虚拟化技术比较

Docker技术概论(1) Docker与虚拟化技术比较 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

深入解析Android-AutoLayout,2024安卓开发面试题及答案

前言 如果你也学习Android,那么你大概率会看过我的文章。经常有读者给我留言:“该怎么学习Android?”、“日常学习Android的方法是什么”。 所以,今天,我将献上一份《Android知识图谱》,以自身的经验 &…

ABAP 发送带EXCEL邮件

前言 没啥特殊需求,就是有个库龄报表用户想整邮件发送 实现 用的最简单的XLS文件作为excel附件发送出去 观察XLS文件的纯文本格式,每列之间用TAB制表符分隔,每行之间用回车符分隔 思路也比较明确,在SAP中实现这种格式&#xf…

.Net利用Microsoft.Extensions.DependencyInjection配置依赖注入

一、概述 为了让接口程序更加模块化和可测试,采用依赖注入的方式调用接口方法。 二、安装Microsoft.Extensions.DependencyInjection 在NuGet里面搜索Microsoft.Extensions.DependencyInjection,并进行安装。 三、代码编写 3.1 创建Service 实现类 /*****************…

【跨境电商须知】FP独立站的特点和痛点有哪些?

无论是做独立站,还是做亚马逊,都有各自的难点。自己做独立站若要在跨境行业长足发展,既要知道FP独立站有什么特点,要清楚FP独立站的痛点并一一克服。 一、FP独立站的特点 与依赖第三方平台相比,拥有自己的域名、服务器…

Doccano 修复 spacy.gold 的bug

引言 最初只是想把Doccano标注的数据集转换成BIO(类似conll2003数据集)的标注格式; 摘要 可先阅读一下教程:【已解决】关于如何将Doccano标注的文本转换成NER模型可以直接处理的CoNLL 2003格式 装包:pip install doccano-transformer 报错信息 运行…

Adam优化算法

Adam算法(Adaptive Moment Estimation)是一种用于深度学习模型优化的算法,它结合了动量(Momentum)和RMSprop(Root Mean Square Propagation)的概念。Adam算法自2015年提出以来,因其高…

【前端素材】推荐优质后台管理系统DAdmin平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面,通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面,使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

FreeCAD|读取STEP、创建平面、相交、瓶子

FreeCAD是一个基于OpenCASCADE的开源CAD/CAE工具。OpenCASCADE是一套开源的CAD/CAM/CAE几何模型核心,来自法国Matra Datavision公司,是著名的CAD软件EUCLID的开发平台。FreeCAD可运行于Windows以及Linux系统环境下,是一种通用的3D CAD建模工具…

记录 关于navicat连接数据库报错1045的问题

重装数据库之后就连接不上了 报错1045 而网上的解决方案大都是更改数据库密码,但是我在第一步就被卡住无法更改密码,输入指令也报错,检查的环境变量也没错,经过长时间的试错终于找到解决了办法 解决办法 删除data文件夹 如果无法…

积累:Qt 多种数据类型之间的转换方法

前言 开发时经常涉及到数据类型的转换,为方便温故知新、提升开发效率,现将 Qt 开发部分常用的数据类型转换方式形成工具文档供查询、参考。 1. int 转 QString 1)函数:QString::number 2)函数原型 //将数字&#xff0…

LD: 利用Plink软件进行连锁不平衡计算和绘图

输入文件详解 PLINK主要使用以下三种文件格式: .ped文件:文本文件,列出所有样本的基因型数据。每行代表一个样本,包含个体和家系信息,以及其对应的基因型数据。.map文件:文本文件,与.ped文件配合使用,列出了基因型数据中所有SNP的位置信息。每行代表一个SNP,包含染色…

Python:练习:输出int值a占b的百分之几。例如:输入1和4,输出:25%。

案例: 输出int值a占b的百分之几。例如:输入1和4,输出:25%。 思考: 所有的一步步思考,最后综合起来。 首先,确定 输出,那么就用input,而且是int值,所以肯定…

springboot2.6.5 下配置ForkJoinPool线程池大小

从java1.7开始,引入了parallelStream的方式使用ForkJoinPool多线程处理数据的方式,ForkJoinPool默认线程池大小是cpu内核数-1,并且可以通过以下方式配置线程池大小: System.setProperty("java.util.concurrent.ForkJoinPool…

C++设计模式_创建型模式_工厂方法模式

目录 C设计模式_创建型模式_工厂方法模式 一、简单工厂模式 1.1 简单工厂模式引入 1.2 简单工厂模式 1.3 简单工厂模式利弊分析 1.4 简单工厂模式的UML图 二、工厂方法模式 2.1 工厂模式和简单工厂模式比较 2.2 工厂模式代码实现 2.3 工厂模式UML 三、抽象工厂模式 3.1 战斗场景…