【问题标题】:Why is Depth-First Search said to suffer from infinite loops?为什么说深度优先搜索会遭受无限循环?
【发布时间】:2011-10-15 16:55:09
【问题描述】:

我已经读过很多关于DFSBFS 的内容,但我一直有这个疑问。在很多文章中都提到了 DFS 可能会陷入无限循环。

据我所知,通过跟踪访问过的节点可以轻松消除此限制。事实上,在我读过的所有书籍中,这个小检查都是 DFS 的一部分。

那么为什么提到“无限循环”是 DFS 的一个缺点?是不是因为原来的 DFS 算法没有对访问节点进行这个检查?请解释一下。

【问题讨论】:

    标签: algorithm search depth-first-search breadth-first-search


    【解决方案1】:

    (1) 在图搜索算法中[在AI上经常使用],DFS的主要优势是空间效率。这是它在 BFS 上的主要优势。但是,如果您跟踪访问过的节点,您将失去此优势,因为您需要将所有访问过的节点存储在内存中。不要忘记访问节点的大小会随着时间的推移而急剧增加,并且对于非常大/无限的图 - 可能不适合内存。

    (2) 有时 DFS 可以在无限分支 [在无限图中]。无限分支是一个没有结束的分支[总是有“更多的儿子”],也不会让你到达你的目标节点,所以对于 DFS,你可能会无限地扩展这个分支,而“错过”好的分支,通向目标节点。

    奖励:
    您可以通过结合使用 DFS 和 BFS 来克服 DFS 中的这个缺陷,同时保持相对较小的内存大小:Iterative Deepening DFS

    【讨论】:

    • 对于问题 #1:我想知道是否只保留当前正在搜索的分支的节点也可以避免 DFS 中的循环? Whenever a node is chosen to be expanded, if it's on that list we can skip it.这样我们就不需要跟踪所有访问过的节点,因此开销不大。对?对于问题 #2:我同意这是 DFS 的主要缺点之一(虽然它的更大缺点确实是它的“不知情”的探索,但我知道你没有提到这一点,因为它与问题无关。只是说好奇的读者)。
    【解决方案2】:

    传统的 DFS 算法确实会跟踪节点。局部搜索算法不追踪状态并且表现得失忆。所以我认为循环主要是指无限分支(具有无限可能状态的分支)。在这种情况下,DFS 只会出现故障并变得过于专注于一个分支。

    【讨论】:

      【解决方案3】:

      如果您不检查循环,则 DFS 可能会卡在一个中而永远找不到它的目标,而 BFS 将始终扩展到下一个深度的所有节点,因此即使存在循环,最终也会找到它的目标。

      简单地说:
      如果您的图表可以有循环并且您正在使用 DFS,那么您必须考虑循环。另一方面,BFS 提供了以牺牲效率为代价忽略循环的选项,这在搜索少量节点时通常是可以接受的。

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多