为什么使用Dijkstra的算法而不是Best(最便宜的)First Search?

时间:2012-04-29 17:38:21

标签: algorithm search graph dijkstra

从我到目前为止所读到的内容。 Best First Search在找到目标的最短路径方面似乎更快,因为Dijkstra的算法在遍历图时必须放松所有节点。是什么让Dijkstra的算法比Best First Search更好?

3 个答案:

答案 0 :(得分:29)

编辑:您的编辑说明您对 Best-First Search 感兴趣,而不是 BFS

Best-First Search实际上是一个明智的算法,它首先扩展了最有希望的节点。非常类似于众所周知的A* algorithm(实际上A *是特定的最佳优先搜索算法)。

Dijkstra是无法通知的算法 - 当您对图表一无所知时应该使用它,并且无法估计每个节点到目标的距离。

请注意,当您对h(v) = 0 v使用heuristic function h(v) = 0时,A *(这是最佳搜索优先)会衰减为Dijkstra的算法。

此外,最佳首次搜索不是最佳 [不保证找到最短路径],如果你不使用admissible heuristic function,还有A *,而Dijkstra的算法是总是最优的,因为它不会在任何启发式上传递。

结论:当你对图表有一些了解时,应该优先选择最佳搜索,并且可以估算与目标的距离。如果你不这样做 - 一个使用 A / \ 1 5 / \ B----1----C 的无知的最佳优先搜索,并且只对已经探索过的顶点进行中继,则会衰减到Dijkstra的算法中。
另外,如果最优性很重要 - Dijkstra的算法总是适合,而最佳优先搜索算法(A *具体)只有在适当的启发函数可用时才能使用。


原始答案 - 回答为什么选择Dijkstra而不是BFS:

BFS在 weighted graphs 时失败。

示例:

w(A,B) = w(B,C) = 1, w(A,C) = 5

在这里:A->C

来自A的BFS将返回A->B->C作为最短路径,但对于加权图,它是权重5的路径!而最短路径是权重2:{{1}}。
Dijkstra的算法不会犯这个错误,并返回最短的加权路径。

如果您的图表未加权 - BFS既是最佳的又是完整的 - 并且通常应该优先于dijkstra - 因为它更简单,更快(至少渐渐地说)。

答案 1 :(得分:1)

通常Best First Search路径查找算法,搜索两个给定节点之间的路径: Source Sink ,但Dijkstra算法找到源和其他所有节点之间的路径节点。所以你无法比较它们。 Dijkstra本身也有点Best First Search(A * 的变体)意味着你不能说它不是最好的第一次搜索。正常的最佳优先搜索算法也使用启发式方法,并且它们不保证正确性。最后在加权情况下,它们的运行时间通常取决于权重,但Dijkstra的算法仅取决于图形大小。

答案 2 :(得分:0)

BFS适用于在所有边具有相同权重的情况下找到从源到顶点的最短路径,即从源到顶点找到最小的边缘数。 虽然Dikjstra对加权图表有好处