我知道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这样复杂的东西,他们只是想将他们的敌人移动到常规网格中的主角?就像有人询问如何在列表中找到最小数字一样,你建议他实现堆排序,然后从排序数组中取出第一个元素。
答案 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)
但是当所有边缘具有相同的成本时,最便宜的路径是具有最小边数的路径?。的是
如果你真的了解你所链接的帖子,你会注意到他们想要解决的问题与你的不同。