这是找到最短路径的最佳算法(时间复杂度)

which is the best algorithm(time complexity) to find the shortest path

我有一个 adjacency matrix。我必须计算最短路径 + 备用路径:

  1. 从一个顶点 (A) 到另一个顶点 (B)
  2. 从所有顶点到单个顶点
  3. 一对顶点
  4. 从每个顶点开始每隔一个顶点

我必须使用图算法(dijkstra、BellManford、BFS)来计算所有这些。谁能建议我实现这些的最佳*算法。

*最好意味着最少的时间;复杂度

这在很大程度上取决于您的数据。维基百科有 pretty good overview 可用的不同算法,以及关于何时有用的一些线索。一个重要因素是您是否可以对边的权重施加一些限制。基本细分大致如下:

相同的正权重

如果所有权重都相同且为正,我们本质上是想找到使用最少边数的路径。在这种情况下,我们可以使用广度优先或深度优先搜索在 O(E + V) 时间内找到单源最短路径。然后在 O(EV + V2) 时间内直接扩展到所有对。

非负边权重

对于单源最短路径问题,可以使用Dijkstra's algorithm。对于普通的二叉堆,这会为您提供 O((E + V) log V) 的时间复杂度。使用 Fibonacci 堆,这可以改进为 O(E + V log V),这对于密集图来说更快。

或者,还有 Gabow 的缩放算法,其 运行 时间为 O(E logR L) 时间,其中 R 为 E/V L是边的最大长度,但是这个算法比Dijkstra的算法复杂很多。

为了找到一对顶点之间的最短路径,您可以使用 A* algorithm(或其派生之一),但这取决于合适的启发式算法的可用性。

负边权重,但没有负循环

单源最短路径由Bellman-Ford algorithm求解,时间复杂度为O(VE)

可以使用 Johnson's algorithm in O(EV + V2 log V) time. Additionally, there is the Floyd-Warshall algorithm 求解所有对最短路径,它在 O(V3) 中求解:这通常在密集图上更快。