比较Dijstra和Prim
Dijstra 和 Prim 算法比较
引言:Dijstra和Prim算法是图论中两种基础的优化算法。只要与图相关的问题,都有可能会用这两种算法来解决问题。信息专业的人一定是学过这两种算法的,不过不知道别人有没有这种感觉,我常常会分不清这两种算法,总觉得这两种算法非常的相似,甚至有时候有的人会把这两种算法混淆着用。为了彻底摆脱这一困惑,决定写篇文章,来区分Dijstra和Prim。
应用场景不同:
Dijstra 和 Prim都是优化算法,但是他们的应用场景不一样。Dijstra是最短路径算法,用来解决在一个图上寻找一个起点到一个终点的最短路径这样的问题;Prim是最小生成树算法,即对于一个图,寻找一个能够包含所有顶点且边的权值和最小的树。
算法步骤不同:
因为解决的问题不同,这两种算法的具体实现方法也就存在差别。
基本思想:最短路径的求解过程中,图中的顶点分属两个集合:指定出发点的顶点为一个集合V,其余顶点为一个集合W。从W中选择一个离V中顶点最近的一个顶点加入到V中,求出了长度最短的一条最短路径,并把刚选择加入最短路径的顶点作为中间点,对其它顶点到源点的路径长度进行修改,求出长度次短的一条最短路径,依次类推,直到从顶点v到其它各顶点的最短路径全部求出为止。
-
实现步骤:
(1)集合和,中存放已找到最短路径的顶点,存放当前还未找到最短路径的顶点。初态,中只包含源点 。
(2)不断从中选取到顶点路径长度最短的顶点加入到中,每加入一个新的顶点,都要修改顶点到中剩余顶点的最短路径的长度,中各顶点新的最短路径长度值为原来的最短路径长度值与顶点的最短路径长度值加上到该顶点的路径长度值中的较小值。
(3)重复(2),直到的顶点全部加入到中为止。
**基本思想:**Prim算法是在由n 个顶点组成的无向连通图中,取图中任意一个顶点V作为生成树的根,之后向生成树上添加新的顶点W。在添加的顶点W和已经在生成树上的顶点V之间必定存在一条边,并且该边的权值在所有连通顶点V和W之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上含有n个顶点为止。
-
实现步骤:
是连通网,是上最小生成树中边的集合。
初态:,开始,重复执行下述操作:
(1)在所有,的边中找一条带权最小的边并入集合并入。
(2)重复(1)直至为止。此时中必有条边,则为的最小生成树。示意图比较
该部分引用自参考资料中的论文。
假设给定下面的图 2.1.1 和 2.2.1 两个 图,图 2.2.1 是用普里姆(Prim)算法构造最小生成 树,其最小生成树的过程如下表 2.1.1 到表 2.1.6 和 图 2.1.1 到图 2.1.6 所示;图 2.2.1 用迪杰斯特拉 (Dijkstra)算法求单源最短路径,其求单源最短路径 的过程如下表 2.2.1 到表 2.2.6 所示。
下面是论文中总结的两种算法的区别:
参考资料:
杨智明,普里姆(Prim)与迪杰斯特拉(Dijkstra) 算法对比分析 ,保山师专学报,2009年9月.