最短路径算法的蛮力BFS与Dijkstra的运行时间分析

时间:2019-02-03 01:15:46

标签: algorithm

Dijkstra的运行时间为O(| E | + | V | log | V |) 而且蛮力BFS的运行时间为O(| E | + | V |)

那么为什么dijkstra的最优呢?看来它的运行时间更长。

编辑:请参阅标记的答案。原来我在加权图上使用BFS进行最短路径的运行时间分析(基本上是蛮力)是不正确的。在加权图上使用蛮力BFS的上限为O(V!)。 Dijstra的最佳。

2 个答案:

答案 0 :(得分:3)

Dijkstra的运行时间为O(|E| + |V|log|V|),但是它可以在加权图中找到源节点和目标节点之间的最短路径。 BFS的运行时间为O(|E| + |V|),但是只有当您的所有边缘都具有相等的权重时,它才能找到源节点和目标节点之间的最短路径。如果您所有的边缘都具有相同的重量,则确实不需要运行Dijkstra。

答案 1 :(得分:1)

我假设您是用蛮力手段指代所有路径组合并选择最快的路径。但这需要您(可能)使用BFS指数倍的时间,在那种情况下,您不能说时间复杂度为O(| V | + | E |)。如果您使用BFS一定时间,则O(| V | + | E |)是。为了说明路径的可能性,我提到了两个图形示例,这些例子表明Dijkstra比暴力BFS更快,因为后者取决于路径的可能性。

一棵平衡的二叉树,该树具有一个根(起点),每个顶点除叶子和目标顶点(其中一个是叶子)外,还有2个子节点。如果从根开始,则路径有2个选择。如果选择其中一个,则还有2个选择,依此类推,直到到达目标顶点。这使2 * 2 * ... * 2条路径成为可能,其中乘以log(| V |)-1倍。是O(n)。这使蛮力BFS算法的运行时间为O(n ^ 2 + nm),比Dijkstra慢。

完整图形:假设您从V1开始,目标为Vn,则可以从V1开始,并为下一个顶点提供V-1可能性。在第二个顶点处,您可以使用V-2,在第三个顶点处,您可以使用V-3,依此类推,直到您到达Vn。这使得V-1 * V-2 * ... * 3 * 2 * 1 = O((V-1)!)可能的路径数,使蛮力BFS算法具有指数级的运行时间。

我们可以将后者视为上限。下限可以是作为路径的图形,这两种算法都需要O(n)时间。我们可以得出结论,在所有情况下,Dijkstra要么快于蛮力BFS算法,要么快于后者。