【问题标题】:Dijkstra's Algorithm complexity vs BFS complexityDijkstra 算法复杂度与 BFS 复杂度
【发布时间】:2026-02-16 05:10:01
【问题描述】:

我一直在练习各种算法,我刚刚完成了 Dijkstra 的算法来计算图上节点之间的最短距离。在完成利用索引 minHeap 的练习后,我还利用 BFS 完成了它(附加解决方案)。这让我想到了几个问题:

  1. 如果我对时间复杂度的计算是正确的 - 我计算出附加解的复杂度为 O(v^2 + e),其中 V = 顶点数,E = 边数。我们迭代和触摸每个节点一次且仅一次,对于边缘也是如此。 v^2 来自移位操作,因为这发生在每次迭代中。
  2. 这个 BFS 解决方案可以通过利用类似于 Java 中的 ArrayDeque 的东西来改进,这将给我们每次从队列前面弹出时 O(1) 操作,并且应该将我们的时间复杂度降低到 O(v+ e)
  3. 如果上述情况属实,那么与 BFS 相比,利用 Dijkstra 算法的优势或用例有哪些。似乎 BFS 的时间复杂度 (O(V+E)) 比 Dijkstra 的 O((V+E)*log(V)) 更好,并且可以防止出现负循环的情况,因为 Dijkstra 会陷入在这种情况下无限循环。

示例输入:

边 = [[[1, 7]], [[2, 6], [3, 20], [4, 3]], [[3, 14]], [[4, 2]], [],[]],

开始 = 0

【问题讨论】:

    标签: time-complexity big-o breadth-first-search dijkstra


    【解决方案1】:

    BFS 和 Dijkstras 算法计算两个不同的东西,它们只是在某些情况下是相同的。

    给定一个起始节点s

    • BFS 根据跳数/边数计算到所有其他节点的最短路径。
    • Dijkstras 算法根据边权重计算到所有其他节点的最短路径。

    这是两个不同的东西,但在某些情况下它们是相同的,例如

    • 图是一棵树(任何给定的节点对之间只有一条路径)
    • 所有边的权重都相等(或图未加权)。

    如果使用斐波那契堆实现,Dijkstras 算法的时间复杂度为 O(|V| log |V| + |E|),而 BFS 的时间复杂度为 O(|V| + |E|)。

    所以你是正确的,如果你的输入允许你在它们之间进行选择,BFS 可能是一个不错的选择。但是,在实践中,您可能希望首先对现实世界的数据进行一些基准测试。

    【讨论】: