大话数据结构--Prim算法

简介: 大话数据结构--Prim算法

7.5.4Prim算法


普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在生成树中的顶点(假设为 A 类),剩下的为另一类(假设为 B 类)。

对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。

image.png

假如从顶点 image.png 出发,顶点 image.png的权值分别为3、4,所以对于顶点 image.png来说,到顶点 image.png 的权值最小,将顶点 image.png加入到生成树中:

image.png

继续分析与顶点 image.png 和  image.png相邻的所有顶点(包括  image.png ),其中权值最小的为 image.png , 将  image.png添加到生成树当中:

image.png

继续分析与顶点 image.png 和  image.png 相邻的所有顶点中权值最小的顶点,发现为 image.png ,则添加到生成树当中。

image.png

继续分析与生成树中已添加顶点相邻的顶点中权值最小的顶点,发现为 image.png ,则添加到生成树中:

image.png

重复上面的过程,直到生成树中包含图中的所有顶点,我们直接看接下来的添加过程:

image.png

image.png

image.png

image.png

此时算法结束,我们找出了图中的最小生成树。

讲的真好!!!

搬运的视频,可以关注下这个,讲数据结构讲的真的好!

Prim算法执行过程。


Prim算法代码实现


// Prim算法生成最小生成树
 void MiniSpanTree_Prim(MGraph G)
 {
  int min, i, j, k;
  int adjvex[MAXVEX];  // 保存相关顶点下标
  int lowcost[MAXVEX]; // 保存相关顶点间边的权值
  lowcost[0] = 0;   // V0作为最小生成树的根开始遍历,权值为0(0,3,*,*,*,4,*,*,*)
  adjvex[0] = 0;   // V0第一个加入
  // 初始化操作
  for( i=1; i < G.numVertexes; i++ )
  {
   lowcost[i] = G.arc[0][i]; // 将邻接矩阵第0行所有权值先加入数组
   adjvex[i] = 0;    // 初始化全部先为V0的下标
  }
  // 真正构造最小生成树的过程
  for( i=1; i < G.numVertexes; i++ )
  {
   min = INFINITY;  // 初始化最小权值为65535等不可能数值
   j = 1;
   k = 0;
   // 遍历全部顶点
   while( j < G.numVertexes )
   {
    // 找出lowcost数组已存储的最小权值
    if( lowcost[j]!=0 && lowcost[j] < min )
    {
     min = lowcost[j];
     k = j;  // 将发现的最小权值的下标存入k,以待使用。
    }
    j++;
   }
   //K的取值依次为:1,5,8,2,6,7,4,3
   // 打印当前顶点边中权值最小的边
   printf("(%d,%d)", adjvex[k], k);(0,1)
   lowcost[k] = 0;  // 将当前顶点的权值设置为0,表示此顶点已经完成任务,进行下一个顶点的遍历(0,0,*,*,*,4,*,*,*)
   // 邻接矩阵k行逐个遍历全部顶点(k=1,)
   for( j=1; j < G.numVertexes; j++ )
   {
    if( lowcost[j]!=0 && G.arc[k][j] < lowcost[j] )
    {
     lowcost[j] = G.arc[k][j];
     adjvex[j] = k; 
    }
   }
  }
 }


时间复杂度分析


上面的代码中,当 i == 1的时候,内层的 while 与 for 循环中 j 的取值范围是从 1 到 n-1,内循环一共计算了 2(n-1) 次,其中n为图中的顶点个数;

当 i == 2 的时候,内层循环还是一共计算 2(n-1) 次;

以此类推......

i 取最大值 n -1,内层循环还是一共计算 2(n-1) 次;

所以,整体的执行次数就是 (n-1) * 2(n-1),Prim算法的复杂度是 image.png级别的。



相关文章
|
17天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
50 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
20天前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
18 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
13天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
29 4
|
20天前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
14 0
数据结构与算法学习十四:常用排序算法总结和对比
|
20天前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
26 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
20天前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
20天前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
16 0
|
8天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
26天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
5天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。