【问题标题】:Time complexity of shortest path algorithm最短路径算法的时间复杂度
【发布时间】:2019-03-07 04:21:47
【问题描述】:

所以我编写了一个算法,可以在无向、未加权的图中找到不同最短路径的数量。我相信这是正确的,我无法弄清楚运行时间是多少。非常感谢所有帮助!

shortestPaths(undirected graph G, startNode v, endNode end)
    initialize  all levels of nodes to -1
    count = 1;
    initialize queue Q = {v}
    level(v) = 0

    while Q is not empty
        curr = pop(Q)

        if( curr == end)
            w = pop(Q)
            while(level(w)==level(curr))
                if(w == end)
                    count++
                w=pop(Q)
            return count

        for all neighbors (nxt) of node curr do 
            if( level(nxt) == -1 )
                level(nxt) = level(curr) + 1
                Push(Q, nxt)
            else if( level(nxt) == level(curr) + 1 )
                Push(Q, nxt)
            else if( level(nxt) > level(curr) + 1)
                Level(nxt) = Level(curr) + 1
    return count        

【问题讨论】:

  • 当然是指数级的。至少 O(2^(|V|/2)),可能不会超过 O(2^|V|)。考虑到您可以在 O(|V|+|E|) 时间内完成此操作,这并不好。
  • 我怎样才能达到 O(|V| + |E|)
  • 我很困惑。无需尝试理解代码:开始和结束之间应该只有一条最短路径,对吧?那么不同的最短路径是什么?
  • 因为可能有两条不同的相同长度的路径,它们都是最短的

标签: algorithm performance queue dijkstra breadth-first-search


【解决方案1】:

算法的运行时间是指数级的。您可以通过不将一个顶点多次推入堆中来避免这种情况,而是将一个计数器与每个顶点相关联,并在每个指向该顶点的新路径中递增它。

试试这样的:

initialize  all counts of nodes to 0                     // added
counts(v) = 1                                            // added
...
while Q is not empty
    curr = pop(Q)

    if( curr == end)
        return counts(curr)

    for all neighbors (nxt) of node curr do 
        if( level(nxt) == -1 )
            level(nxt) = level(curr) + 1
            counts(nxt) = counts(curr)                   // added
            Push(Q, nxt)
        else if( level(nxt) == level(curr) + 1 )
            counts(nxt) += counts(curr)                  // added & removed
return 0

这与BFS - O(|E|+|V|) 具有相同的复杂性。

【讨论】:

  • 感谢您的回复@Yola,我对它返回的内容有点困惑。是计数(结束节点)吗?或最大计数
  • @RaoulDuke 我已经更新了代码,一旦我们弹出结束节点,我们就完成了——它的计数器必须包含到它的路径数。如果我们永远不会到达结束节点,那么就没有通往它的路径。
  • 我想我真的明白了。在您编写的代码中,我想我也可以取出 w = popQ 和 while 循环并返回 count(end)。再次感谢您的帮助。这更有意义
  • @RaoulDuke 很高兴我能帮上忙。我还想指出,您不需要第三个条件。您只需要在 Dijkstra 中检查,而不是在 BFS 中检查。
  • @RaoulDuke 是的,您可能需要探索所有边缘。
猜你喜欢
  • 2016-08-25
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2019-08-21
相关资源
最近更新 更多