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
这是两个不同的东西,但在某些情况下它们是相同的,例如
图是一棵树(任何给定的节点对之间只有一条路径) 所有边的权重都相等(或图未加权)。如果使用斐波那契堆实现,Dijkstras 算法的时间复杂度为 O(|V| log |V| + |E|),而 BFS 的时间复杂度为 O(|V| + |E|)。
所以你是正确的,如果你的输入允许你在它们之间进行选择,BFS 可能是一个不错的选择。但是,在实践中,您可能希望首先对现实世界的数据进行一些基准测试。
【讨论】:
以上是关于Dijkstra 算法复杂度与 BFS 复杂度的主要内容,如果未能解决你的问题,请参考以下文章