广度优先搜索和迭代深化之间的区别

时间:2010-06-08 00:54:58

标签: search depth-first-search breadth-first-search iterative-deepening

我理解BFS和DFS,但对于我的生活无法弄清迭代加深与BFS之间的区别。显然迭代加深与DFS具有相同的内存使用率,但我无法看到这是如何可能的,因为它只是像BFS一样不断扩展。 如果有人能澄清那将是非常棒的。

如果需要,可以使用树:

    A
   / \
  B   C
 /   / \
D   E   F

4 个答案:

答案 0 :(得分:18)

根据我对算法的理解,IDDFS(迭代加深深度优先搜索)只是多次执行深度优先搜索,加深了每次迭代搜索的节点级别。因此,内存需求与深度优先搜索相同,因为最大深度迭代只是完全深度优先搜索。

因此,对于您给出的树的示例,第一次迭代将访问节点A,第二次迭代将访问节点A,B和C,第三次迭代将访问树的所有节点。 / p>

这样实现的原因是,如果搜索有时间限制,那么算法至少会知道“好得分”节点在达到时间限制之前是什么完全遍历树。

这与广度优先搜索不同,因为在每次迭代时,访问节点就像在深度优先搜索中一样,而不是像广度优先搜索那样。通常,IDDFS算法可能会存储每次迭代中找到的“最佳得分”节点。

答案 1 :(得分:17)

从我所理解的迭代深化DFS下降到深度1然后DFS下降到深度2 ...下至深度n,依此类推直到找不到更多级别

例如我认为树会被读取

read                   visited               depth

A                      A                     1

ABC                    ABAC                  2

ABDCEF                 ABDBACECF             3

我相信它几乎为每个级别做了一个具有深度限制的单独DFS并丢弃了内存。

答案 2 :(得分:4)

内存使用量是它在任何时候保存的最大节点数。不是访问过的节点数。

任何时候IDFS都需要只存储它正在扩展的分支中的节点。如果我们正在扩展C(在你的例子中),只需要A和C. BFS必须保存正在搜索的深度的所有节点。为了看到效果采用分支因子为8而不是2的树来搜索深度为3,BFS需要存储大量的64个节点。 IDFS只需要3个。

答案 3 :(得分:2)

在迭代加深搜索的每个迭代中,我们都有一个限制,我们使用DFS方法遍历图,但是,对于每个迭代的每个步骤,我们只需要跟踪从根到路径内的节点即可。到深度d。那就是节省内存。

例如,查看下面图片的最后一行。如果我们使用了BFS,则必须跟踪所有深度为2的节点。但是,由于我们使用的是DFS,因此我们不需要将所有节点都保留在内存中,因为有些节点已经被访问过,因此我们不必需要它们,或者尚未访问过,因此我们将在以后添加。我们只保留到根的路径(灰色路径)。

enter image description here

图片来自Peter Norvig和Stuart Russel的人工智能书