我正在研究DFS和Dijkstra。 在我的简单测试用例中,大多数都表明DFS更快。 在我的测试用例中,传递每个节点的成本相同。 但是大多数人在寻路方面更喜欢Dijkstra和DFS,因为Dijkstra非常准确。
那么,DFS和Dijkstra有什么区别? 另外,每种算法的优缺点是什么?
答案 0 :(得分:2)
DFS一直沿着节点跳转,直到找到 路径为止,而Dijkstra更类似于BFS,除了它跟踪权重(并非所有路径都有相同的成本),并将继续检查最短路径在到达目标之前尚未检查过。
一般来说,DFS是(通常)查找路径的最快方法,并且可以通过递归非常轻松地实现,但Dijkstra算法是找到最短路径的最快通用方法
在一个不太常见的情况下,有一个A *,这是Dijkstra的算法,顶部有一些额外的启发式算法,可以猜测哪些路径最好先检查。这也将找到尽可能短的路径,但如果您的启发式方法很好,可能会更快。
编辑:
我应该补充一点,如果你想要一个“非常好”的路径并且可以使用启发式方法,那么如果你的图表没有太多的死角,带有启发式的DFS通常是一个不错的选择。这称为Greedy Best First Search,是一种很好的,未充分利用的路径寻找算法,可用于例如游戏,你可以设计你的地图几乎没有死角,或路线图,其中A *非常昂贵。
答案 1 :(得分:1)
其中大多数表明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会很好。