每次限制搜索深度的深度优先搜索。本质还是深度优先搜索,只不过在搜索的同时带上了一个深度d,当d达到设定的深度时就返回,一般用于最优解。如果一次搜索没有找到合法的解,就让设定的深度加1,重新从要开始。因为BFS的基础是一个队列,队列的空间复杂度很大,当状态比较多或者单个状态比较大时,使用队列的BFS就显出了劣势。事实上,迭代加深类似于用DFS方式实现的BFS,它的空间复杂度相对较小。
当搜索树的分支比较多时,每增加一层的搜索复杂度会出现指数级爆炸式增长,这时前面重复进行的部分所带来的复杂度几乎可以忽略,这也就是为什么迭代加深是可以近似看成BFS。
1、步骤
首先设定一个较小的深度作为全局变量,进行DFS。第进入一次DFS,将当前深度加一,当发现d大于设定的深度limit就返回。如果在搜索的过程中发现了答案就可以回溯,同时在回溯的过程中可以记录路径 。如果没有发现答案,就返回到函数入口,增加设定深度,继续搜索。
2、代码框架
IDDFS(u, d)
if d > limit
return
else
for each edge (u, v)
IDDFS(v, d + 1)
return
3、注意事项
在大多数情况下,广度优先搜索还是比较方便的,而且容易判重。当发现广度优先搜索在空间上不够优秀,而且要找最优解的问题时,就应该考虑迭代加深。
4、实践
参考资料: