【发布时间】: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