图搜索算法-最小生成树问题-普里姆算法(prim)

相关文章:
数据结构–图的概念
图搜索算法 - 深度优先搜索法(DFS)
图搜索算法 - 广度优先搜索法(BFS)
图搜索算法 - 拓扑排序
图搜索算法-最短路径算法-戴克斯特拉算法
图搜索算法-最短路径算法-贝尔曼-福特算法
图搜索算法-最小生成树问题-克鲁斯卡尔算法(kruskal)

普里姆(Prim)算法

普里姆(Prim)算法也属于贪心算法,它是根据寻找邻近结点最小键值来构成最小生成树,先来认识算法步骤。
(1)创建一个最小生成树集合(简称MST),跟踪记录包含在内的结点值。
(2)为图中的所有结点分配一个键值。将所有键值初始化为无穷大。将第一个结点的键值指定为0,以便首先选择它。
(3)当MST包含所有结点,程序结束,否则到步骤四。
(4)选择一个在MST中不存在且具有最小键值的结点u,并包含在MST中。
(5)更新u所有相邻结点的键值,对于每个相邻结点v,如果边u-v的权重小于v的先前键值,则将键值更新为u-v的权重。
(6)重复步骤三。

分析步骤,普里姆算法有两个循环,每个循环为结点数量N,所有时间复杂度为O(N^2),空间上同样需要保存最小生成树的结果,所以空间复杂度为O(N)。继续用之前的作为例子如下图,
在这里插入图片描述
手动计算来熟悉此算法。首先挑选【广州】作为出发点,初始化每个结点的键值,如表所示。
在这里插入图片描述
接着遍历【广州】邻近的结点(灰色表示在MST集合中),更新邻近结点的键值,如图所示。

在这里插入图片描述
这时候下一个最小键值的结点便可以选择【厦门】(或者【成都】),同理更新【厦门】邻近结点的键值,结果如下图所示。

在这里插入图片描述
看到【武汉】的键值没有改变,是因为4>3,不需要更新(图中虚线代表连接无效)。同样的方式,挑选【成都】,再次更新邻近结点的键值,如下图所示。
在这里插入图片描述
此时MST包含了【广州,厦门,成都】,下一个最小键值结点便是【武汉】,同理更新邻近的结点,如图所示。
在这里插入图片描述
这时候【上海】的键值发生变化,由原来的5变成了1。然后就继续挑选下一个结点【上海】,最后是【北京】,最终的结果如下图所示。
在这里插入图片描述
从图中得知最后结果与前面克鲁斯卡尔算法求解得出的结果是一致的,MST上的所有边的权重和同样是14。
现在用代码来表示算法,首先使用邻近矩阵定义图结构,创建一个【GraphArray】类,接受二维矩阵输入。

class GraphArray(): """用邻接矩阵表示图"""def __init__(self, points):self.amount = len(points) # 记录结点的总数self.points = points      # 记录结点位置和值的关系# 初始化图的邻接矩阵self.graph = [[0 for _ in range(self.amount)] for _ in range(self.amount)]

然后创建一个【GraphPrimMST】类代表此算法,primMST()函数是算法主程序,min_key()函数是为了寻找最小键值的结点,最后是printMST()函数是为了在屏幕清晰地输出结果。

class GraphPrimMST(GraphArray): """普里姆算法法,输入的是有权无向图,求解最小生成树"""def printMST(self, result): print("边 \t\t 权重")  # 结果输出total = 0for i in range(1, self.amount):total +=  self.graph[i][ result[i]]print(self.points[result[i]], "-", self.points[i], "\t", self.graph[i][ result[i]])print("总权重和:", total)def min_key(self, key, mst):# 寻找最小键值的结点下标min = float("Inf")  # 默认是无穷大for v in range(self.amount): if key[v] < min and mst[v] == False: min = key[v] min_index = v return min_index def primMST(self):# 普里姆算法主程序key = [float("Inf")] * self.amount # 默认结点键值是无穷大parent = [None] * self.amount # 记录最小生成树集合的边,也就是答案key[0] = 0  # 把第一个结点作为第一个选择的结点,键值设置为0 MST = [False] * self.amount  # 记录最小生成树集合已访问结点parent[0] = -1 # 根节点没有父结点,初始化为-1for _ in range(self.amount):u = self.min_key(key, MST)  # 选择一个在MST中不存在且具有最小键值的结点uMST[u] = True # 记录为已访问结点for v in range(self.amount):# 当边的权重为正,而且没有被访问,若键值比原来小,则更新结点的键值if self.graph[u][v] > 0 and MST[v] == False and key[v] > self.graph[u][v]: key[v] = self.graph[u][v]  # 更新结点键值parent[v] = u  # 更新所选择的边self.printMST(parent)

根据例子,验证程序是否正确。

g = GraphPrimMST(["广州","厦门","成都","武汉","上海","北京"]) 
g.graph = [ [0, 2, 2, 3, 0, 0], [2, 0, 0, 4, 5, 0],[2, 0, 0, 8, 0, 7],[3, 4, 8, 0, 1, 9],[0, 5, 0, 1, 0, 6],[0, 0, 7, 9, 6, 0]]
g.primMST()
# ------------结果------------------
边                权重
广州 - 厦门          2
广州 - 成都          2
广州 - 武汉          3
武汉 - 上海          1
上海 - 北京          6
总权重和: 14

更多内容

想获取完整代码或更多相关图的算法内容,请查看我的书籍:《数据结构和算法基础Python语言实现》

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

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

相关文章

【069】基于SpringBoot+Vue实现的企业资产管理系统

系统介绍 基于SpringBootVue实现的企业资产管理系统管理员功能有个人中心&#xff0c;用户管理&#xff0c;资产分类管理&#xff0c;资产信息管理&#xff0c;资产借出管理&#xff0c;资产归还管理&#xff0c;资产维修管理。用户可以对资产进行借出和归还操作。因而具有一定…

软考-下午题-试题一

1、概念 2、答题技巧和规范 问题1、2&#xff1a;直接看 格式&#xff1a; 问题3&#xff1a; 格式&#xff1a; 3、例题 eg2&#xff1a;可以以后写完问题4之后&#xff0c;把问题3补充完整 问题4&#xff1a; 问题4 官方解释&#xff1a; 问题4&#xff08;3‘&#xff09; 2…

在做题中学习(58):和为K的子数组

560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; 因为是判断子数组的和 要返回 k 的次数&#xff0c;所以 解法&#xff1a;前缀和 哈希表 提出一个概念&#xff1a;以下标i为结尾的所有子数组 那要找出所有和 k的子数组 就相当于&#xff1a;找出所有值为…

JAVA实验项目(二): 抽象类、接口的定义与使用

实验项目二 抽象类、接口的定义与使用 Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&…

C#实现多线程的几种方式

前言 多线程是C#中一个重要的概念&#xff0c;多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景&#xff0c;可以充分利用多核处理器和系统资源&#xff0c;提高应用程序的性能和效率。 多线程常用场景 CPU 密集型任务…

物联网促进信息化——​青创智通工业物联网解决方案​

随着传感器网络&#xff08;WSN)、无线射频识别&#xff08;RFID&#xff09;以及微电子机械系统(MEIVIS&#xff09;等技术的不断成熟,扩展了人们对信息获取和使用的能力&#xff0c;并将提高制造效率、改善产品质量、降低产品成本和资源消耗、为用户提供更加透明和个性化的服…

玩转Matlab-Simscape(初级)- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分1)

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&#xff08;理论部分1&#xff09; ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&am…

网关过滤器实现接口签名检验

背景 往往项目中的开放接口可能被别有用心者对其进行抓包然后对请求参数进行篡改&#xff0c;或者重复请求占用系统资源为此我们行业内使用比较多的策略是接口签名校验。签名校验的实现可以用注解aop的形式实现&#xff0c;也可以使用过滤器统一拦截校验实现&#xff0c;此篇文…

图形化编程桌面 跨部门协作的新工具

中午&#xff0c;阳光洒满大地&#xff0c;微风轻拂&#xff0c;给人带来温暖和活力。卧龙和凤雏在享用过午餐后&#xff0c;决定到公司附近的湖边散步&#xff0c;享受这难得的宁静时光。 卧龙望着湖面泛起的波光&#xff0c;顺手折下一根嫩绿的柳枝&#xff0c;在手中不停地摆…

运维别卷系列 - 云原生监控平台 之 04.prometheus 查询语句 promql 实践

文章目录 [toc]PromQL 简介什么是时间序列 PromQL 数据类型即时向量 Instant vector范围向量 Range vectorTime DurationsOffset modifier modifier 浮点值 Scalar字符串 String PromQL FUNCTIONSfloor()irate()rate()round()sort()sort_desc() PromQL 运算符算术运算符比较运算…

TortoiseGit的安装

TortoiseSvn和TortoiseGit都是针对代码进行版本管理的工具&#xff0c;又俗称小乌龟&#xff0c;简洁而可视化的操作界面&#xff0c;免去繁琐的命令行输入。只需要记住常用的几个操作步骤就能快速上手。 TortoiseGit安装 1、TortoiseGit作为git的版本管理工具 &#xff0c;但…

无感自动透明加密系统

无感透明加密系统是一种高级的数据安全技术&#xff0c;它在不影响用户正常操作的前提下&#xff0c;对指定的文件或数据进行自动加密和解密。这种系统设计的目的是为了提高信息安全级别&#xff0c;确保敏感信息在存储和传输过程中的保密性&#xff0c;同时又不会给合法用户的…

5.9网络协议

由网卡发送数据通过网线进行发送&#xff0c;当网卡接收到信号以后将数据传给内核数据区&#xff0c;然后由操作系统交给相应的进程。 将数据进行发送的时候需要借助于网线实现&#xff0c;这个时候会出现当传输的数据比较远的时候就借助于中继器将信号进行再生扩大&#xff0…

FedDML:Federated Mutual Learning

这篇把DML运用到FL上 论文地址:arvix code: 作者git 贡献 我们针对三种异质性(DOM)提出了一种新颖的联邦学习范式,称为联邦相互学习(FML)。 首先,FML 处理数据和目标通过使每个客户能够训练个性化模型来实现异质性。 从OH的意义上来说,DH对服务器有害,但对客户端有…

STL—string类(1)

一、string类 1、为什么要学习string&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP&#xff08;面向对象…

爱校对新功能上线:领导人讲话和职务排序校对

我们很高兴地宣布&#xff0c;爱校对网站正式推出两项新功能&#xff1a;领导人讲话校对和领导人职务排序校对。这些新功能旨在帮助用户更准确地引用和整理领导人讲话内容&#xff0c;以及正确排列领导人的职务顺序。 领导人讲话校对 在撰写报告或文章时&#xff0c;引用领导…

气膜建筑使用寿命由什么决定—轻空间

气膜建筑作为一种新型建筑结构&#xff0c;以其独特的优点在全球范围内逐渐普及。其使用寿命是投资者和用户关注的关键问题。气膜建筑的使用寿命主要由以下几个方面决定&#xff1a; 1. 膜材 膜材是气膜建筑的核心组成部分&#xff0c;其质量直接影响到建筑的使用寿命。以下是影…

智能网红主播直播手机:助您轻松卖货、卖团购卷、拓客利器!

在当下快速发展的电商行业中&#xff0c;直播销售已经成为无可忽视的一大趋势。智能网红主播直播手机的出现&#xff0c;让人们无需拥有专业设备和经验&#xff0c;便可轻松参与直播销售&#xff0c;享受销售乐趣。本文将介绍智能网红主播直播手机的操作简单、易上手以及其在卖…

JAVA二手车交易二手车市场系统源码支持微信小程序+微信公众号+H5+APP

二手车交易二手车市场系统&#xff1a;重塑购车新体验 随着汽车消费市场的日益成熟&#xff0c;二手车交易逐渐成为消费者购车的新选择。为了提供更加便捷、透明、安全的二手车交易环境&#xff0c;我们推出了“二手车交易二手车市场系统”&#xff0c;旨在为买卖双方搭建一个…

新书速览|Django 5 Web应用开发实战

构建未来&#xff0c;用Django 5打造全新Web应用 本书内容 《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体&#xff0c;是一本从零基础到精通Django Web企业级开发技术的实战指南。《Django 5 Web应用开发实战》内容以Python 3.x和Django 5版本为基础…