微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dijkstra 算法复杂度与 BFS 复杂度

如何解决Dijkstra 算法复杂度与 BFS 复杂度

我一直在练习各种算法,我刚刚完成了 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 将陷入在这种情况下是无限循环。

样本输入:

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

开始 = 0

shortest distance - breadth first search

解决方法

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

给定一个起始节点 s

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。