Algorithm 迪克斯特拉';s算法-为什么每次提取优先级最小的顶点?

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

我正在学习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[]
函数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[]