迭代加深ID-DFS搜索算法
迭代加深搜索,实质上就是限定下界的深度优先搜索。即首先允许深度优先搜索K层搜索树,若没有发现可行解,再将K+1后重复以上步骤搜索,直到搜索到可行解。
迭代加深搜索算法的实现原理及基本框架
在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个深度约束逐次加1,直到搜索到目标为止。
基本框架如下:
ProcedureID-dfs(dep:integer);
Var
J:integer;
Begin
Ifdep>深度的限界thenexit;//如果搜索的深度大于限界,则返回上一层
Forj:=1tondo // 按照规则生成子结点
If子结点安全then
Begin
入栈;
If子结点是目标结点then对目标结点进行处理,退出程序
Elseid-dfs(dep+1);
退栈;
End;
End;
Fori:=1todepmaxdo//枚举深度的限界
Begin
Id-dfs(i);
If运行超时thenbreak;
End;
迭代加深搜索算法的复杂度分析
从上述迭代加深搜索算法的实现过程和框架,我们可以看出,迭代加深搜索算法就是仿广度优先搜索的深度优先搜索。既能满足深度优先搜索的线性存储要求,又能保证发现一个最小深度的目标结点。(时间复杂度推算详见NOI导刊2010年第6期P26)
从实际应用来看,迭代加深搜索的效果比较好,并不比广度优先搜索慢很多,但是空间复杂度却与深度优先搜索相同,比广度优先搜索小很多。
迭代加深搜索算法的应用
使用搜索算法的时候,选择正确的搜索方式很重要。当有一类问题需要做广度优先搜索,但却没有足够的空间,而时间却很充裕,碰到这类问题,我们可以选择迭代加深搜索算法。
例题:POJ 2286 The Rotation Game
四、总结
一般来说,如果目标结点离根结点远,需要遍历整棵树,可以考虑使用深度优先搜索;如果目标离根结点近,或求最小步数,则考虑广度优先搜索或迭代加深搜索;若广度优先搜索存在空间不够的问题,则考虑使用迭代加深搜索。