dfs之迭代加深

为什么要用迭代加深

\(dfs\) 每次会选择搜索树的一个分支,不断深入,直到达到递归边界条件;但这种搜索策略带有一定的缺陷性:

如果搜索树的某一个分支中的节点个数特别多,但是答案并不在这棵子树里面,那么我们就需要花费很多的无用时间去搜索这棵子树。

如图:

dfs之迭代加深

在这张图中,假设我们的目标节点是标五角星的节点,我们会首先搜索框框中的子树,然后才会搜到目标节点。这会浪费我们很多时间。

因此,我们需要想出一种思路去优化这种搜索策略。

什么是迭代加深

还是那上面那个图来举例子。如果我们按层搜索,那么只要搜索三层就可以搜索到当前节点了,这样可以节省我们很多时间。

所以,可以规定搜索最大层数\(max\)\(depth\),只要搜索到\(max\)\(depth\)仍然无解,那么我们就扩展\(max\)_\(depth\), 扩大深度继续搜索目标。

误区解释

  • Q : 我们每次扩展深度的时候,会重复搜索\(maxdepth - 1\) 到 \(1\) 层之间的节点,这样就不会浪费时间了吗??

  • A : 虽然深度限制为 \(maxdepth\) 时,会重复搜索 \(1\) - \(maxdepth - 1\)之间的节点,但是当搜索树节点分支数目较多时,随着层数的深入,每层的节点个数会呈指数级增长,这点搜索重复和深层节点的搜索冗余相比实在是太少了。

迭代加深经典例题

Acwing 170. 加成序列 (来源:《算法竞赛进阶指南》

上一篇:黄金矿工(2022-2-5)每日一练


下一篇:递归与递推