是BFS的最佳搜索算法



我知道Dijkstra算法,Floyd-Warshall算法和Bellman-Ford算法在图中寻找两个顶点之间的最短路径。

但是当所有边的代价相同时,最便宜的路径是边数最少的路径?我说的对吗?没有理由实现Dijkstra或Floyd-Warshall,最好的算法是从源开始广度优先搜索,直到我们到达目标?在最坏的情况下,你必须遍历所有顶点,所以复杂度是O(V)?没有更好的解决办法吗?我说的对吗?

但是在互联网上有很多文章,讨论了有障碍物的网格中的最短路径,他们提到了Dijkstra或A*。即使在stackoverflow -算法找到最短的路径,与障碍或在这里http://qiao.github.io/PathFinding.js/visual/

那么,所有这些人都是愚蠢的吗?还是我太笨了?为什么他们会推荐像Dijkstra这样复杂的东西给那些只想在规则网格中移动敌人到主角身边的新手呢?这就像有人问如何在一个列表中找到最小的数,你建议他实现堆排序,然后从排序数组中取出第一个元素。

BFS(广度优先搜索)只是一种浏览图的方式。它的目标是访问所有的顶点。这是所有。另一种移动图的方法可以是DFS。

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

Dijkstra并不复杂,即使对初学者来说也是如此。它在图形上移动,使用BFS +做更多的事情。这更多的是存储和更新关于当前访问顶点的最短路径的信息。

如果你想找到两个顶点v和q之间的最短路径,你可以对Dijkstra做一点修改。当你到达顶点q时就停止。

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

但是当所有边的代价相同时,最便宜的路径是边数最少的路径?我说的对吗?

.

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

当涉及到这样一个简单的情况,所有边都有相同的权值-你可以使用任何你喜欢的方法,一切都可以工作。然而,具有良好启发式的A*应该比BFS和Dijkstra更快。在您提到的模拟中,您可以观察到。

那么,所有这些人都是愚蠢的吗?还是我太笨了?为什么他们会推荐像Dijkstra这样复杂的东西给那些只想在规则网格中移动敌人到主角身边的新手呢?

他们有不同的问题,这改变了解决方案。仔细阅读问题描述:

(…)问题是任何点(不包括A和B)都可以有一个阻碍道路的障碍物,因此必须绕道而行

敌人可以在通往主角的路上设置障碍。因此,例如,在这种情况下,A*是一个很好的选择。

BFS就像一个在无加权图中寻找最短路径的"蛮力"。Dijkstra算法就像加权图的"蛮力"。如果你在一个未加权的图上使用Dijkstra's,它将完全等同于BFS。

因此,Dijkstra's可以被认为是BFS的扩展。它并不是一个真正"复杂"的算法;它只比BFS稍微复杂一点。

A*是Dijkstra's的扩展,它使用启发式来加速寻路。

但是当所有边的代价相同时,最便宜的路径是边数最少的路径?

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

最新更新