最小生成树(Minimum Spanning Tree)及生成MST的几种方法

2023-12-03 03:36

本文主要是介绍最小生成树(Minimum Spanning Tree)及生成MST的几种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最小生成树 (Minimum Spanning Tree)

最小生成树是图论领域的一个基本概念,适用于加权连通图,其中包括若干顶点(节点)以及连接这些顶点的边(边可以有权重)。在一个加权连通图中,生成树(Spanning Tree)是一个无环子图,它包含图中的所有顶点,并且用最少数量的边将它们连接起来。注意,无环是指子图中不存在任何边的闭环,最少数量的边意味着任意两个顶点之间有且仅有一条路径相互到达。

“最小生成树”这一术语的“最小”指的是在所有可能的生成树中,边的权重之和最小的那一个。在实际应用中,最小生成树可以帮助找到在网络设计、电路设计等方面成本最低的方案。

我们来举一个简单的例子。假设有四个城市,每两个城市之间可以修建道路相连,不同的道路成本不同,现在的目标是花最少的成本将这四个城市全部连通。最小生成树算法即是解决此类问题的有效工具。

生成最小生成树的算法

接下来,我们将介绍四个生成最小生成树的经典算法,它们分别是克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法,以及相对少见的Borůvka算法和Sollin算法。

1. 克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔算法是基于边的贪心策略。它的基本思想是按照边权重从小到大的顺序选择边,从而构造最小生成树。选取的边必须满足添加后不形成环路。

伪代码:
KRUSKAL(G):A = ∅                            // A将存储最小生成树的边对于G中的每个顶点v:MAKE-SET(v)将G中的所有边按权重由低到高排序对于每条边(u, v)按序做如下操作:if FIND-SET(u) ≠ FIND-SET(v):   // 检查u和v是否在树的不同分量中A = A ∪ {(u, v)}               // 将边(u, v)加入到A中UNION(u, v)                    // 将u和v的分量合并返回A

其中 MAKE-SET、FIND-SET 和 UNION 是不相交集合数据结构的操作,用于维护和查询顶点间是否存在环路。

2. 普里姆(Prim)算法

普里姆算法是基于点的贪心策略。在这个算法中,我们从任选的一个顶点开始构建最小生成树,逐步扩大树的范围,每一步都添加一条连接树与非树顶点且权重最小的边。

伪代码:
PRIM(G, w, r):                     // G是图,w是权重函数,r是开始顶点for each u ∈ G.V:u.key = ∞                      // 初始化所有顶点的键值为无穷大u.π = NIL                       // π属性用来记录最小生成树的父节点r.key = 0Q = G.Vwhile Q ≠ ∅:u = EXTRACT-MIN(Q)             // 从Q中取出键值最小的顶点ufor each v ∈ G.Adj[u]:         // 遍历u的所有邻居vif v ∈ Q and w(u, v) < v.key:v.π = u                     // 更新v的父节点为uv.key = w(u, v)             // 更新v的键值为u与v之间边的权重

在Prim算法中,EXTRACT-MIN(Q)是优先队列的操作,它用于选择权重最小的边,而G.Adj[u]表示图中与顶点u相邻的所有顶点集合。

3. Borůvka算法

Borůvka算法是最早的最小生成树算法之一,适用于稀疏图。算法的每个阶段为图中的每个连通分量选择一条权重最小的边,并将这些边添加到生成树中,直到图变为连通的。

伪代码:
BORUVKA(G):forest = each vertex in G is a separate treewhile there is more than one tree in the forest:for each tree T in the forest:find the smallest edge connecting T to another treeadd this edge to the forestreturn the edges added to the forest
4. Sollin算法

Sollin算法(也被称为Borůvka的改进版本)同样适用于稀疏图,其基本想法是在每个阶段找到每个连通分量键值最小的边,并将它们加入生成树,像Borůvka算法一样重复这个过程,直到所有分量合并到一起。

伪代码:
SOLLIN(G):Initialize a forest F with each vertex in G as a separate treewhile F has more than one tree dofor each tree T in the forest F dolet e = the lightest edge with one end in Tif there is no edge chosen for T or e is lighter than the already chosen edgechoose e for Tfor each edge e chosen in this round doif e connects two different trees thenadd e to the forest Freturn the forest F as the minimum spanning tree

在Sollin算法中,检查加入边e后是否会造成环路的操作通过查询树的根节点来实现,保证了每次迭代加入的边一定属于不同的连通分量。

如果你想更深入地了解人工智能的其他方面,比如机器学习、深度学习、自然语言处理等等,也可以点击这个链接,我按照如下图所示的学习路线为大家整理了100多G的学习资源,基本涵盖了人工智能学习的所有内容,包括了目前人工智能领域最新顶会论文合集和丰富详细的项目实战资料,可以帮助你入门和进阶。

链接: 人工智能交流群(大量资料)

在这里插入图片描述

这篇关于最小生成树(Minimum Spanning Tree)及生成MST的几种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447938

相关文章

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d