用于在未加权有向图中查找两个节点之间的最短路径的最有效(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,扩展的节点数在解的深度(最短路径)上呈指数增长d:O (bd),其中b是分支因子(每个状态的平均后继数)。
选择最适合你的。
在一般情况下,对于未加权图中(无论是有向还是无向)的单源、单目的地最优最短路径,没有已知算法可以胜过广度优先搜索。
但是,如果您有特殊情况,可以提供可接受的启发式算法,则可以使用 A* 搜索实现更高效的搜索。
我正在寻找最有效的算法,根据大 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,扩展的节点数在解的深度(最短路径)上呈指数增长d:O (bd),其中b是分支因子(每个状态的平均后继数)。
选择最适合你的。
在一般情况下,对于未加权图中(无论是有向还是无向)的单源、单目的地最优最短路径,没有已知算法可以胜过广度优先搜索。
但是,如果您有特殊情况,可以提供可接受的启发式算法,则可以使用 A* 搜索实现更高效的搜索。