BFS是最佳搜索算法吗?

时间:2013-04-27 07:23:41

标签: dijkstra shortest-path

我知道Dijkstra的算法,Floyd-Warshall算法和Bellman-Ford算法,用于找出图中2个顶点之间最最的路径。

但是当所有边缘都具有相同的成本时,最便宜的路径是具有最小边数的路径?我对吗?没有理由实施Dijkstra或Floyd-Warshall,最好的算法是从源头进行广度优先搜索,直到达到目标为止?在最坏的情况下,您将不得不遍历所有顶点,因此复杂度为O(V)?没有更好的解决方案?我对吗?

但互联网上有大量的文章,谈论有障碍的网格中的最短路径,他们提到Dijkstra或A *。即使在StackOverfow上 - Algorithm to find the shortest path, with obstacles 或者http://qiao.github.io/PathFinding.js/visual/

那么,那些人都是傻瓜吗?或者我是傻瓜?为什么他们向初学者推荐像Dijkstra这样复杂的东西,他们只是想将他们的敌人移动到常规网格中的主角?就像有人询问如何在列表中找到最小数字一样,你建议他实现堆排序,然后从排序数组中取出第一个元素。

3 个答案:

答案 0 :(得分:4)

BFS(广度优先搜索)只是一种旅行图表的方式。它的目标是访问所有顶点。就这样。另一种移动图形的方法可以是例如DFS。

Dijkstra是一种算法,其目标是找到从给定顶点v到所有其他顶点的最短路径。

Dijkstra并不是那么复杂,即使是初学者也是如此。它运行图表,使用BFS +做更多事情。更多的是存储和更新有关当前访问顶点的最短路径的信息。

如果你想找到2个顶点v和q之间的最短路径,你可以通过对Dijkstra的一点修改来做到这一点。当你到达顶点q时停下来。

最后一个算法 - A *在某种程度上是最聪明的(也可能是最困难的)。它使用启发式,神奇的仙女,建议你去哪里。如果你有一个很好的启发式函数,这个算法优于BFS和Dijkstra。 A *可以看作是Dijktra算法的扩展(启发式函数是一个扩展)。

  

但是当所有边缘都有相同的成本时,最便宜的路径就是   边数最小的路径?我是对的吗?

右。

  

没有理由实施Dijkstra或Floyd-Warshall,这是最好的   算法是广度优先搜索?我是对的吗?

当涉及到所有边缘具有相同重量的简单情况时 - 您可以使用您喜欢的任何方法,一切都会起作用。然而,具有良好启发式的A *应该比BFS和Dijkstra更快。在你提到的simulation中,你可以观察到。

  

那么,那些人都是傻瓜吗?或者我是傻瓜?为什么他们向初学者推荐像Dijkstra这样复杂的东西,他们只想把他们的敌人移动到常规网格中的主角?

他们有一个不同的问题,它改变了解决方案。请仔细阅读问题说明:

  

(...)任何一点(不包括A和B)的捕获都可以有   阻碍路径的障碍物,因此必须绕道而行。

敌人在前往主角的途中可能会遇到障碍。所以,例如A *在这种情况下是一个不错的选择。

答案 1 :(得分:2)

BFS就像是一个“蛮力”,可以在未加权的图表中找到最短的路径。 Dijkstra就像加权图的“蛮力”。如果您在未加权的图表上使用Dijkstra,它将完全等同于BFS。

因此,Dijkstra可以被视为BFS的延伸。它实际上不是一个“复杂”的算法;它只比BFS稍微复杂一点。

A *是Dijkstra的扩展,它使用heuristic来加速寻路。

答案 2 :(得分:0)

但是当所有边缘具有相同的成本时,最便宜的路径是具有最小边数的路径?。的

如果你真的了解你所链接的帖子,你会注意到他们想要解决的问题与你的不同。