【问题标题】:Running Time of BFS vs DijkstraBFS 与 Dijkstra 的运行时间
【发布时间】:2021-12-08 21:50:42
【问题描述】:

我有一个未加权的连通图 G,它有 n 个顶点和 m 个边。
m=O(n log n)。
我想找到从顶点 s 到顶点 v 的最短路径。
我想知道 BFS 遍历或 Dijkstra 算法是否会渐近更快。

BFS 将从 s 开始。 Dijkstra的算法,从s开始,实现一个斐波那契堆。

BFS的运行时间为Θ(n+m) = O(n+n log n) = O(n log n)
而Dijkstra的运行时间为O(m+n log n) = O(n log n+n log n) = O(n log n)

对于这个问题,两种算法都是渐近地一样快,还是我错过了什么?

【问题讨论】:

  • 如果在未加权图上执行,Dijkstra 和 BFS 是相同的算法。其余的只是算法中未指定的实现细节。而在加权图上,BFS 找不到最短路径,只能找到一条路径,这种情况下的比较很奇怪。
  • 您已经找到了两者的上限 -- O(n log n),并得出运行时间相同的结论。但是你的推理是错误的,你得出了错误的结论。例如,对于树,dijkstra 在 Theta(n log n) 时间内运行,而 BFS 在 Theta(n) 时间内运行(对于树,m=n-1,即 O(n log n))。
  • @Paul,请注意问题以 m=O(nlogn) 开头。
  • @trincot 很难准确地说出“m = O(n log n)”是什么意思——你能准确定义它吗?也许像“有一个 c>0 使得对于我们考虑的所有图,边的数量 (m) 总是小于 c * n log n 其中 n 是顶点的数量。”。但这包括非常稀疏的图,对于这些图,BFS 在理论上优于 Dijkstra(例如,树的子集)。
  • 让我们请作者定义他们的意思;-)。据我了解,树木将被排除在外。

标签: algorithm graph time-complexity breadth-first-search dijkstra


【解决方案1】:

对于未加权图的给定属性:

  • ?(?,?) 已连接,并且
  • |?| ∈ θ(|?|log|?|)

...我们确实可以推导出 BFS 和 Dijkstra 算法的时间复杂度为 ?(|?|)。

只是一个补充说明:

短语“asymptotically as fast” 并不意味着存在一个输入大小,在该输入大小之上,两种算法都会运行得一样快。这意味着对于足够大的输入,它们的运行时间(在同一台计算机上)的比率将保持在恒定的最小/最大范围内。

由于斐波那契堆有相当多的开销,而 BFS 只需要一个简单的队列或两个数组,毫无疑问,这个有界比率将有利于 BFS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多