Algorithm 迪克斯特拉';s算法-为什么每次提取优先级最小的顶点?
我正在学习Dijkstra的算法来寻找最短路径。我注意到有一个优先级队列来帮助提取顶点集中优先级最低的顶点。如果我从顶点集中选择一个优先级不受影响的顶点,而不是优先级最低的顶点,该算法是否仍然有效如果是,时间复杂度如何? 维基百科最初的Dijkstra算法如下:Algorithm 迪克斯特拉';s算法-为什么每次提取优先级最小的顶点?,algorithm,time-complexity,pseudocode,dijkstra,shortest-path,Algorithm,Time Complexity,Pseudocode,Dijkstra,Shortest Path,我正在学习Dijkstra的算法来寻找最短路径。我注意到有一个优先级队列来帮助提取顶点集中优先级最低的顶点。如果我从顶点集中选择一个优先级不受影响的顶点,而不是优先级最低的顶点,该算法是否仍然有效如果是,时间复杂度如何? 维基百科最初的Dijkstra算法如下: function Dijkstra(Graph, source): dist[source] ← 0 create vertex set Q f
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[]
函数Dijkstra(图,源):
地区[来源]← 0
创建顶点集Q
对于图形中的每个顶点v:
如果v≠ 来源
区[v]← 无穷
上一页[v]← 未定义
Q.add_与_优先级(v,dist[v])
Q不是空的:
U← Q.摘录_min()
对于u的每个相邻v:
中高音← 距离[u]+长度(u,v)
如果alt
修改后,无论优先级如何拾取顶点(请注意,松弛后有一个“添加”):
函数DijkstraVariant(图,源):
地区[来源]← 0
创建顶点集Q
对于图形中的每个顶点v:
如果v≠ 来源
区[v]← 无穷
上一页[v]← 未定义
只需添加(v)//不关心优先级
Q不是空的:
U← Q.random_pick()//不关心优先级
对于u的每个相邻v:
中高音← 距离[u]+长度(u,v)
如果alt
不,它不起作用。它将产生一条路径,但不再保证它是最短的
优先级需要考虑非均匀权重,对于普通FIFO队列,只有当所有边权重相等时,优先级才会起作用。它变成了一个简单而广泛的第一次搜索
使用随机选择,而不是优先级,该算法进一步细化方向,直至深度优先搜索。这也消除了BFS提供的所有保证,例如,即使在有限时间内的无限图中也能找到任何现有路径。不,它将不起作用。它将产生一条路径,但不再保证它是最短的 优先级需要考虑非均匀权重,对于普通FIFO队列,只有当所有边权重相等时,优先级才会起作用。它变成了一个简单而广泛的第一次搜索
使用随机选择,而不是优先级,该算法进一步细化方向,直至深度优先搜索。这也消除了BFS提供的所有保证,例如,即使在有限时间内的无限图中也能找到任何现有路径。你想举一个例子来反驳修改后的版本吗?@LazyBoy非常简单,只要拿一个环形图来说,起点和终点由一条边长为1000的单条边连接,以及一条由100条边组成的链,每条边的重量为1。你的随机化算法现在有1/2^100的机会选择最短路径,在所有其他情况下,它会落在代价很高的边缘。你是说这个图吗@那不是戒指。将节点2连接到节点0而不是节点1,将节点0声明为原点,将节点1声明为目标。您是否想举出一个例子来反驳修改后的版本?@LazyBoy非常简单,只需使用一个环形图,其中起点和终点由单条边连接,单条边的权重为1000,以及一条由100条边组成的链,每条边的重量为1。你的随机化算法现在有1/2^100的机会选择最短路径,在所有其他情况下,它会落在代价很高的边缘。你是说这个图吗@那不是戒指。将节点2连接到节点0而不是节点1,将节点0声明为原点,将节点1声明为目标。
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[]