algorithm - 最短路径算法的时间复杂度

标签 algorithm performance queue dijkstra breadth-first-search

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

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        

最佳答案

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

尝试这样的事情:

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|)

关于algorithm - 最短路径算法的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52601588/

相关文章:

algorithm - 放置 N 点以最小化到点列表的距离

C#任务多队列节流

c# - 我正在统一制作一个基于文本的游戏 (5.2.3) 我被困在这个 :

javascript - 如何在 JavaScript "without using ` +` or ` -` operators"中添加两个数字?

algorithm - 组合益智游戏

c - 如果二进制搜索数字不在索引中,如何返回 NULL?

c++ - 我怎样才能使 cout 更快?

java - 加快矩阵查找速度

c++ - QPlainTextEdit显示缓慢的性能

c++ - 如何创建一个模板参数是抽象基类的队列?