Dijkstra的算法 - 为什么每次都提取具有最小优先级的顶点?

时间:2017-10-27 05:20:52

标签: algorithm time-complexity pseudocode dijkstra shortest-path

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

经过修改以选择顶点而不考虑优先级(请注意,有一个&#34;添加&#34;放松后):

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[]

1 个答案:

答案 0 :(得分:4)

不,它不会起作用。它将产生一条路径,但它不再保证是最短路径。

需要优先考虑非均匀权重,使用普通FIFO队列只有在所有边权重相等时才能使用。它成为一个广泛的第一次搜索。

使用随机选择而不是优先级,算法进一步减少,直到深度优先搜索的水平。这也消除了BFS提供的所有保证,例如在有限时间内无限图中找到任何现有路径。