软考-软件设计师:数据结构-图:生成树、最小生成树、克鲁斯卡尔(Kruskal)算法、普里姆(Prim)算法

生成树

连通图的生成树:是该图的 极小连通子图,即:含有图中全部 n 个顶点,但只有 n-1 条边

如下图:

分类

图的生成树 不是唯一 的。从不同的顶点出发,选择不同的存储方式,用不同的求解方法,可以得到不同的生成树。

  • 由深度优先搜索遍历得到的生成树,称为 深度优先 生成树
  • 由广度优先搜索遍历得到的生成树,称为 广度优先 生成树

下图中无向图G7的两种生成树:

最小生成树

图的所有生成树中,边上的 权值之和最小 的树

构造最小生成树的3个准则

  • 只能使用该网络的边来构造最小生成树
  • 只能使用 n-1 条边来连接 n 个顶点
  • 不能形成环路

算法

  • 普里姆(Prim)算法
  • 克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔(Kruskal)算法

每次选取图中 权值最小的边,直到把所有点连起来

注意:不能形成环路

时间复杂度

时间复杂度为 O(e\log_2e) (e 边的数量)

计算过程:为了实现 “每次选取图中 权值最小的边”,所以要先从小到大排序,而排序算法最快就是 O(e\log_2e),主要耗时就是排序

特点

与图中的 顶点数量无关,适合于求 边稀疏 的网的最小生成树。

普里姆(Prim)算法

从 某个点开始,找该点 权值最小 的边,直到把所有点连起来

注意:不能形成环路

时间复杂度

用 邻接矩阵 存储,时间复杂度为 O(n²) (n 顶点数量)

计算过程:

  1. 每次要找离生成树最近的点
  2. 都要把所有 V 个顶点扫一遍

一共找 V 次,所以:O(V × V) = O(V²)

特点

与图中的 边数无关,因此该算法适合于求 边稠密的网 的最小生成树。

Kruskal和Prim的对比

Kruskal 算法 Prim 算法
算法类型 贪心算法 贪心算法
适用图类型 稀疏图,特别适合边权值分布较广的图 稠密图,特别适合顶点多边多的图
基本思想 从边的角度出发,按权值从小到大选择边 从顶点出发,每次扩展最小权值的边
时间复杂度 O(nlog₂n) O(n²)
典型应用 网络设计问题,边多且分散的图 电网、网络设计问题,稠密的图
贪心选择标准 每次选择权值最小且不形成环的边 每次选择最小的连接权值,扩展已加入的顶点集合
  • Kruskal:适用于 稀疏图,因为其从边的角度出发,边的数量相对少时效率更高。
  • Prim:适用于 稠密图,因为它每次从顶点出发,逐渐扩展树,对于稠密图(边多的图)效率更高

参考:
https://blog.csdn.net/Peisenli/article/details/100114809
https://blog.csdn.net/2301_79188764/article/details/142172901


原文出处:/show_1GWwGMkdgg9.html