Dijkstra 算法复杂度与 BFS 复杂度

Posted

技术标签:

【中文标题】Dijkstra 算法复杂度与 BFS 复杂度【英文标题】:Dijkstra's Algorithm complexity vs BFS complexity 【发布时间】:2021-04-22 08:36:05 【问题描述】:

我一直在练习各种算法,我刚刚完成了 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

【问题讨论】:

【参考方案1】:

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

给定一个起始节点s

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

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

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

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

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

【讨论】:

以上是关于Dijkstra 算法复杂度与 BFS 复杂度的主要内容,如果未能解决你的问题,请参考以下文章

邻接表实现Dijkstra算法以及DFS与BFS算法

Dijkstra算法与Prim算法辨析

Floyd算法与Dijkstra算法的区别?

求最短路径(Bellman-Ford算法与Dijkstra算法)

算法提高课——搜索

Dijkstra算法