Dijkstra算法和Prim算法的确切区别是什么?我知道Prim算法会给出MST,但由Dijkstra生成的树也将是MST。那么确切的区别是什么?
Dijkstra算法和Prim算法的确切区别是什么?我知道Prim算法会给出MST,但由Dijkstra生成的树也将是MST。那么确切的区别是什么?
def dijkstra(g, s):
q <- make_priority_queue(VERTEX.distance)
for each vertex v in g.vertex:
v.distance <- infinite
v.predecessor ~> nil
q.add(v)
s.distance <- 0
while not q.is_empty:
u <- q.extract_min()
for each adjacent vertex v of u:
...
def prim(g, s):
q <- make_priority_queue(VERTEX.distance)
for each vertex v in g.vertex:
v.distance <- infinite
v.predecessor ~> nil
q.add(v)
s.distance <- 0
while not q.is_empty:
u <- q.extract_min()
for each adjacent vertex v of u:
if v in q and weight(u, v) < v.distance:// <-------selection--------
...
vertex.distance 的计算是第二个不同点。Dijkstra算法仅用于查找最短路径。
在最小生成树(Prim或Kruskal算法)中,您可以获得具有最小边值的最小边数。
例如:考虑一种情况,您想要创建一个巨大的网络,因此需要大量电线,因此可以使用最小生成树(Prim或Kruskal算法)来计算电线数量 (即它将为您提供创建巨大有线网络连接所需的最少电线数量和最低成本)。
而"Dijkstra算法"将用于在连接任何节点时获取两个节点之间的最短路径。
在代码层面上,另一个区别是API。
您可以使用源顶点s初始化Prim,即Prim.new(s)
; s可以是任何顶点,而无论s如何,最小生成树(MST)的边缘都是相同的。要获取MST边缘,我们调用方法edges()
。
您可以使用源顶点s初始化Dijkstra,即Dijkstra.new(s)
,以获取到所有其他顶点的最短路径/距离。最终结果,即从s到所有其他顶点的最短路径/距离取决于s。要获取从s到任何顶点v的最短路径/距离,我们分别调用方法distanceTo(v)
和pathTo(v)
。
f(u,v)
。Prim算法和Dijkstra算法之间的区别仅在于您使用哪个f(u,v)
。它们都使用贪心算法创建树。
使用Prim算法,我们找到最小成本生成树。目标是找到覆盖所有节点的最小成本。
使用Dijkstra算法,我们找到单源最短路径。目标是找到从源到每个其他节点的最短路径。
Prim算法与Dijkstra算法完全相同,除了:
*D
|
|4
|
5 | 5
A*-----*B-----*C
\__________/
8
从节点A开始,Prim和Dijkstra都会选择节点B。但是接下来,Prim会选择节点D,而Dijkstra会选择节点C。
graph[u][v] < key[v]
,而对于 Dijkstra 算法,条件为dist[u]+graph[u][v] < dist[v]
。因此,从这两个页面中的图表可以看出,它们之间的主要区别在于这两行代码。 - JW.ZG