最小生成树的概念与思想

简介: 数据结构中的图存储结构包含顶点和边,分为连通图与非连通图。生成树是包含所有顶点、任意两点间仅有一条通路的极小连通图。最小生成树则是权值总和最小的生成树,常用于解决道路建设等实际问题,常用算法有普里姆算法和克鲁斯卡尔算法。

数据结构提供了 3 种存储结构,分别称为线性表、树和图,如图 1 所示。


图 1 3 种存储结构

a) 是线性表,b) 是树,c) 是图。 在图存储结构中,a、b、c 等称为顶点,连接顶点的线称为

线性表是最简单的存储结构,很容易分辨。树和图有很多相似之处,它们的区别是:树存储结构中不允许存在环路,而图存储结构中可以存在环路(例如图 1 c) 中,c-b-f-c、b-a-f-b 等都是环路)。


本节要讲的最小生成树和图存储结构息息相关,接下来我们将结合图存储结构,给大家讲解什么是生成树,以及什么是最小生成树。

生成树

根据所有顶点之间是否存在通路,图存储结构可以细分为连通图非连通图。举个例子:


图 2 连通图与非连通图


图 2 a) 是一个非连通图,比如图中找不到一条从 a 到 c 的路径。图 2 b) 是一个连通图,因为从一个顶点到另一个顶点都至少存在一条通路,比如从 a 到 c 的通路可以为 a-f-c、a-b-c 等。


所谓生成树,指的是具备以下条件的连通图:

  • 包含图中所有的顶点;
  • 任意顶点之间有且仅有一条通路。


图 2 b) 是一个连通图,其对应的生成树有很多种,例如:


图 3 生成树


图 2 b) 对应的生成树还有很多,图 3 仅给大家列出了其中的 4 种。也就是说,一个连通图可能对应着多种不同的生成树。

最小生成树

借助生成树,可以解决实际生活中的很多问题。例如,为了方便 6 座城市中居民的生产和生活,政府要在 6 座城市之间修建公路。本着节约资金的原则,6 座城市只需要建立 5 条公路即可实现连通,如何修建公路才能最大程度上节省资金呢?


我们将 6 座城市分别用 a~f 表示,6 座城市之间可以修建的公路以及所需资金如下图所示:


图 4 城市道路模拟图

a~f 这 6 个顶点各自代表一座城市,连接两个顶点的边代表两座城市之间可以修建公路,每条边对应的数值称为,表示修建公路所需要的资金。

如图 4 所示,在连通图的基础上,我们赋予每条边一个数值,这样的连通图又称连通网。一个连通网对应生成树可能有多种,每个生成树中所有边的权值的总和,就是这个生成树的总权值。例如结合图 4 ,图 3 a) 生成树的总权值为 17,图 3 c) 的总权值为 13。


最小生成树指的就是在连通网中找到的总权值最小的生成树。在连通图查找最小生成树,常用的算法有两种,分别称为普里姆算法克鲁斯卡尔算法,您可以点击它们做详细地了解。

相关文章
|
11月前
|
存储 搜索推荐 算法
归并排序算法
归并排序是一种基于分治思想的高效排序算法,通过将序列不断划分为不可再分的子序列,再两两合并完成排序。其时间复杂度为O(nlogn),适用于对序列进行升序或降序排列。
542 0
|
11月前
|
算法
回溯算法的基本思想
本节介绍回溯算法,通过图1中从A到K的路径查找示例,说明其与穷举法的异同。回溯算法通过“回退”机制高效试探各种路径,适用于决策、优化和枚举问题。
371 0
|
11月前
|
存储 算法 Java
求数组中的最大值和最小值
本文介绍了在程序中如何查找数组中的最大值和最小值,重点讲解了两种算法:普通算法和分治算法。普通算法通过遍历数组直接比较元素大小,找出最值;而分治算法则通过递归将数组划分成更小的部分,分别找出各部分的最大值,最终合并结果得到整个数组的最大值。文章以 {3,7,2,1} 为例,详细演示了两种算法的实现过程,并提供了 C、Java 和 Python 的代码示例。
794 0
|
11月前
|
算法 Java C语言
汉诺塔问题
汉诺塔问题源自印度古老传说,涉及将一组圆盘从一根柱子移动到另一根,遵循特定规则。文章详细介绍了该问题的背景、解决思路以及如何使用分治算法实现,同时提供了C语言、Java和Python的代码示例。
754 0
|
4月前
|
机器学习/深度学习 缓存 监控
大模型应用:矩阵乘加(GEMM)全解析:大模型算力消耗的逻辑与优化.68
GEMM(矩阵乘加)是大模型算力核心,占Transformer计算量90%以上。本文系统解析其数学原理、高维适配、算力测算公式,并详解INT8/INT4量化、矩阵分块、硬件加速与批处理四大优化策略,结合代码示例与性能监控方法,助力高效推理落地。
923 17
|
人工智能 数据安全/隐私保护
|
11月前
|
算法 Java C语言
弗洛伊德算法求最短路径
弗洛伊德算法用于寻找加权图中各顶点间的最短路径,适用于无向图和有向图。算法基于动态规划思想,通过枚举中间顶点来更新路径,确保最终得到最短路径。该算法要求路径权值非负,否则可能出错。
788 0
|
11月前
|
搜索推荐 算法
桶排序算法
桶排序是一种高效的排序算法,基于分治思想,理想时间复杂度为O(n)。它通过将数据分到多个桶中,每个桶再单独排序,最后按序合并各桶元素,从而实现整体有序。
719 0
|
11月前
|
搜索推荐 Java C语言
插入排序算法
插入排序算法是一种简单直观的排序方法,通过将每个元素插入到已排序序列中的合适位置,最终完成整个序列的排序。其时间复杂度为 O(n²),适用于小规模数据的排序。
334 0

热门文章

最新文章