用于在未加权有向图中查找两个节点之间的最短路径的最有效(Big O)算法

Most efficient (Big O) algorithm for finding the shortest path between two nodes in an unweighted directed graph

我正在寻找最有效的算法,根据大 O 表示法,在未加权的有向图中找到两个节点之间的最短路径。

我主要分为 Dijkstra 的堆和呼吸优先搜索,如果图形被加权,我通常会使用它。

未加权的图是否使 Dijkstra 在这种情况下的使用效率低于 BFS?

根据Wikipedia

单源最短路径

  • BFS - O(V + E)
  • Dijkstra(带列表)- O(V²)
  • Dijkstra(修改后的二叉堆)- O((E+V)logV)
  • Dijkstra(使用 Fibonacci 堆)- O(E + VlogV) - Fredman & Tarjan 实现
  • Dijkstra(使用 Fibonacci 堆)- O(EloglogV) - Johnson、Karlsson 和 Poblete 实现

A* 的时间复杂度取决于启发式算法。在无界搜索的最坏情况下space,扩展的节点数在解的深度(最短路径)上呈指数增长dO (bd),其中b是分支因子(每个状态的平均后继数)。

选择最适合你的。

在一般情况下,对于未加权图中(无论是有向还是无向)的单源、单目的地最优最短路径,没有已知算法可以胜过广度优先搜索。

但是,如果您有特殊情况,可以提供可接受的启发式算法,则可以使用 A* 搜索实现更高效的搜索。