【问题标题】:Dijkstra's algorithm- why every time extract the vertex with smallest priority?Dijkstra 算法 - 为什么每次都提取优先级最小的顶点?
【发布时间】: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


    【解决方案1】:

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

    优先级需要考虑非均匀权重,对于普通的 FIFO 队列,它仅在所有边权重相等时才有效。它变成了一个简单的广泛的首次搜索。

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

    【讨论】:

    • 您想举个例子来反驳修改后的版本吗?
    • @LazyBoy 很简单,只需要一个环形图,其中开始和结束由一条边连接,一侧的权重为 1000,而一条由 100 条边组成的链,每条边的权重为 1另一个。您的随机算法现在有 1/2^100 的机会选择最短路径,而在所有其他情况下,它会以高成本落入边缘。
    • 你说的是这张图吗? link to graph
    • @LazyBoy 那不是戒指。将节点 2 连接到节点 0 而不是节点 1,声明节点 0 为起点,节点 1 为目标。
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多