学习笔记-图论-Prim算法的两种描述

简介

在前几个学期学习离散数学和数据结构的时候学习过图论的基本知识,这个学期学通信网络基础时候把一些算法又学了一遍。其中Prim算法的描述稍有差异,以下对这两种描述进行简要介绍,并说明其等价性。

描述一:集合版本

数据结构课程中多采用此种描述。例子引自:知乎-Prim算法——最小生成树

具体内容

  1. 用两个集合A{}, B{}分别表示找到的点集和未找到的点集;
  2. 以A中的点为起点a,在B中找一个点为终点B,这两个点构成的边(a,b)应为其余边中最小的;
  3. 重复2,直至B中点集为空,A中点集为满。

算法例子

描述1解析

描述二:权值矩阵版本

以下的这段描述看似复杂,实际上只是讲得稍微啰嗦了一点。

主要的区别,在于用权值矩阵一个数据结构就表达了描述一中的集合A、B,以及边的权重。可能代码实现起来会更方便吧。

具体内容

  1. 写出图G的权值矩阵;
  2. 由点 v 1 v_{1} v1开始,在行1中找出最小元素 w 1 j w_{1j} w1j
  3. 在行1和行j中,剔除列1和列j的元素,并在这两行余下的元素中找出最小元素,如 w j k w_{jk} wjk(如有多个最小元素可任选其中一个);
  4. 在行1、行j和行k中,圈去列1、列j和列k的元素,并在这三行余下的元素中找出最小元素;
  5. 直至矩阵中所有元素均被圈去,即找到图G的一棵最小生成树。

算法例子

用描述2的方式解描述1的同一道题,便于理解两种描述实际上讲的是同一个东西。
描述1解析

总结

通过例子可以看出找到的生成树是一样的,实际上两种描述显然是等价的。

  • 描述1中的集合A、B;在描述2中体现为未被划掉的、已被划掉的元素(实际上是这些元素所在的行/列)。
  • 描述1中,以A中节点a为起点,以B中节点b为终点;在描述2中体现为寻找行i中的元素 w i j w_{ij} wij

胡言乱语

实际上,你愿意倒着来的话,按描述2做法,但是将划掉某列改成划掉某行,显然也是能做的。换成描述1就等于以A中节点a为终点,以B中节点b为起点的做法。

补充1:Dijkstra算法

不同于用于求解最小生成树的Kruscal算法和Prim算法。Dijkstra算法和Prim算法是用于求解最短路径问题的。
Dijkstra算法与Flod如上图,Dijkstra算法运行一次就可以获得某一点 v i v_{i} vi到其他所有点 G − { v i } G-\{v_{i}\} G{vi}的所有最短路径(故称之单最短路径)。这是其与Floyd算法的不同之处

具体内容

  1. 对于图 G G G,选定源节点 v i v_{i} vi G p = { v i , } G_{p}=\{v_{i}, \} Gp={vi,}
  2. 维护一个列表 l i s t 1 list1 list1,记录 v i v_{i} vi ∀ v j ∈ G − G p \forall v_{j}\in G-G_{p} vjGGp的距离 d ( v i , v j ) d(v_{i}, v_{j}) d(vi,vj)
  3. 对于 ∀ v j ∈ G − G p \forall v_{j}\in G-G_{p} vjGGp,查询 m i n   d ( v i , v j ) min\ d(v_{i}, v_{j}) min d(vi,vj),将 v j v_{j} vj加入 G p G_{p} Gp中;
  4. v j v_{j} vj为转节点,查询是否有“ v i v_{i} vi出发,经过 v j v_{j} vj ∀ v k ∈ G − G p \forall v_{k}\in G-G_{p} vkGGp的更短路径”,有则更新表 l i s t 1 list1 list1中的距离 d ( v i , v k ) d(v_{i}, v_{k}) d(vi,vk)
  5. 对于2中新得到的 G p G_{p} Gp重复执行2~4,不断更新 l i s t 1 list1 list1 G p G_{p} Gp直至 G p = G G_{p}=G Gp=G为止。

算法例子

Dijkstra算法例子

与Prim的异同

容易看出此处 G p G_{p} Gp G − G p G-G_{p} GGp其实就是Prim算法(描述1)中的集合 A A A和集合 B B B

区别在于,Prim算法中更新 A A A时,考虑的是 ∀ v h ∈ A \forall v_{h} \in A vhA ∀ v j ∈ B \forall v_{j} \in B vjB的最短距离 d h , j d_{h,j} dh,j;而Dijkstra算法中,我们不关心节点到联通分量 G p G_{p} Gp的距离,而是要溯源于 v i v_{i} vi——因此,考虑 v i v_{i} vi ∀ v j ∈ G − G p \forall v_{j} \in G-G_{p} vjGGp的距离 d i j d_{ij} dij

因此,显然Dijkstra算法得到的子图,也是一颗生成树。只不过由于算法机制,得到的不一定是最小生成树。但这棵树满足"根节点到任意叶子节点的距离是全局最小的"这一要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值