【发布时间】:2018-04-08 15:27:34
【问题描述】:
我正在学习 Dijkstra 的算法来寻找最短路径。我注意到有一个优先级队列可以帮助提取顶点集中优先级最低的顶点。如果我从顶点集中选择一个顶点而不考虑优先级,而不是优先级最低的那个,算法是否仍然有效? 如果是,时间复杂度如何?
来自维基百科的原始 Dijkstra 算法是这样的:
function Dijkstra(Graph, source):
dist[source] ← 0
create vertex set Q
for each vertex v in Graph:
if v ≠ source
dist[v] ← INFINITY
prev[v] ← UNDEFINED
Q.add_with_priority(v, dist[v])
while Q is not empty:
u ← Q.extract_min()
for each neighbor v of u:
alt ← dist[u] + length(u, v)
if alt < dist[v]
dist[v] ← alt
prev[v] ← u
Q.decrease_priority(v, alt)
return dist[], prev[]
修改后选择顶点不考虑优先级(请注意松弛后有一个“添加”):
function DijkstraVariant(Graph, source):
dist[source] ← 0
create vertex set Q
for each vertex v in Graph:
if v ≠ source
dist[v] ← INFINITY
prev[v] ← UNDEFINED
Q.just_add(v) // Don't care about the priority
while Q is not empty:
u ← Q.random_pick() // Don't care about the priority
for each neighbor v of u:
alt ← dist[u] + length(u, v)
if alt < dist[v]
dist[v] ← alt
prev[v] ← u
Q.just_add(v) // Don't care about the priority
return dist[], prev[]
【问题讨论】:
标签: algorithm time-complexity pseudocode dijkstra shortest-path