我已多次阅读DFS和BFS但我怀疑这个问题长期以来一直挥之不去。在很多文章中都提到DFS可能会陷入无限循环中。
据我所知,通过跟踪访问过的节点可以很容易地消除这种限制。事实上,在我读过的所有书中,这个小支票都是DFS的一部分。
那么为什么'无限循环'被提到是DFS的缺点?是因为原始DFS算法没有对访问过的节点进行此检查吗?请解释一下。
答案 0 :(得分:21)
(1)在图表搜索算法[在AI上经常使用],DFS的主要优势是空间效率。这是它在BFS上的主要优势。但是,如果跟踪受访节点,则会失去此优势,因为您需要将所有访问过的节点存储在内存中。不要忘记访问节点的大小随着时间的推移而急剧增加,对于非常大/无限的图形 - 可能不适合内存。
(2)有时DFS可以在无限分支 [在无限图中]。无限分支是一个不结束的分支[总是有“更多的儿子”],也不会让你到达你的目标节点,所以对于DFS,你可以继续扩展这个分支,并且“错过”好的分支,这将导致目标节点。
<强>加成:强>
你可以通过使用DFS和BFS的组合来克服DFS中的这个缺陷,同时保持相对较小的内存大小:Iterative Deepening DFS
答案 1 :(得分:3)
传统的DFS算法会跟踪节点。本地搜索算法不会跟踪状态并且与健忘症一起行为。所以我认为循环主要是指一个无限分支(一个具有无限可能状态的分支)。在这种情况下,DFS只会变得过于集中在一个分支上。
答案 2 :(得分:0)
如果你不检查循环,那么 DFS 可能会卡在一个并且永远找不到它的目标,而 BFS 总是会扩展到下一个深度的所有节点,因此即使存在循环,最终也会找到它的目标。< /p>
简单来说:
如果您的图形可以有循环并且您使用的是 DFS,那么您必须考虑循环。另一方面,BFS 提供了以牺牲效率为代价忽略循环的选项,这在搜索少量节点时通常是可以接受的。