【问题标题】:In pathfinding, what is the difference between DFS and Dijkstra?在寻路中,DFS 和 Dijkstra 有什么区别?
【发布时间】:2017-12-07 09:25:26
【问题描述】:
我正在研究 DFS 和 Dijkstra。
在我的简单测试用例中,大多数都表明 DFS 更快。
在我的测试用例中,通过每个节点的成本相同。
但是大多数人更喜欢 Dijkstra 而不是 DFS 在寻路中,因为 Dijkstra 非常准确。
那么,DFS 和 Dijkstra 有什么区别?
另外,每种算法的优缺点是什么?
【问题讨论】:
标签:
algorithm
depth-first-search
dijkstra
path-finding
【解决方案1】:
DFS 一直沿节点跳跃,直到找到 a 路径,而 Dijkstra 更类似于 BFS,除了它跟踪权重(并非所有路径都具有相同的成本)并且将继续检查最短路径在到达目标之前尚未检查。
一般来说,DFS 是(通常)最快的找到路径的方法,并且可以通过递归非常容易地实现,但 Dijkstra 的算法是找到最短可能路径的最快一般方法.
在不太一般的情况下,有 A*,这是 Dijkstra 的算法,顶部有一些额外的启发式算法来猜测哪些路径可能最好先检查。这也将找到最短的路径,但如果您的启发式方法很好,可能会更快。
编辑:
我应该补充一点,如果您想要一个“相当不错”的快速路径并且可以使用启发式算法,那么如果您的图表没有太多死胡同,那么带有启发式算法的 DFS 通常是一个不错的选择。这称为Greedy Best First Search,是一种很好的、未充分利用的寻路算法,可用于例如游戏,您可以在其中设计地图以减少死胡同,或者 A* 非常昂贵的路线图。
【解决方案2】:
他们中的大多数表明 DFS 更快
DFS 速度更快,因为开销更少。
DFS 使用堆栈,弹出和添加到堆栈速度很快。
然而,使用堆实现的最有效的 Dijkstra,添加到堆的速度较慢。
DFS 的运行时间是 O(V + E),Dijkstra 是 O((V + E) log V)。注意到 Dijkstra 添加了 log V,这是添加到堆中的成本,因此它比 DFS 慢。
大多数人在寻路中更喜欢 Dijkstra 而不是 DFS,因为 Dijkstra 非常准确。
好吧,Dijkstra 从起点找到最短路径。
DFS 不保证最短路径,它只会生成访问图中非常节点的路径。
BFS 也能找到最短路径
Dijkstra 找到加权图的最短路径。如果图没有加权边,那么 BFS 或 Dijkstra 就可以了。