【发布时间】:2026-02-16 05:10:01
【问题描述】:
我一直在练习各种算法,我刚刚完成了 Dijkstra 的算法来计算图上节点之间的最短距离。在完成利用索引 minHeap 的练习后,我还利用 BFS 完成了它(附加解决方案)。这让我想到了几个问题:
- 如果我对时间复杂度的计算是正确的 - 我计算出附加解的复杂度为 O(v^2 + e),其中 V = 顶点数,E = 边数。我们迭代和触摸每个节点一次且仅一次,对于边缘也是如此。 v^2 来自移位操作,因为这发生在每次迭代中。
- 这个 BFS 解决方案可以通过利用类似于 Java 中的 ArrayDeque 的东西来改进,这将给我们每次从队列前面弹出时 O(1) 操作,并且应该将我们的时间复杂度降低到 O(v+ e)
- 如果上述情况属实,那么与 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