迭代加深搜索(Iterative Deepening DFS,IDDFS)是深度优先搜索,它与普通深度优先搜索不同的是,每次深搜都会有搜索的最大深度限制,如果没有找到解,那么就增大深度,再进行深搜,如此循环直到找到解为止,这样可以找到最浅层的解。
IDDFS 适合场景:当搜索树非常深,但是我们能确定答案一定在浅层节点时,就可以使用迭代加深DFS。
maxdepth=0; //搜索深度(步数、层次)
while(!dfs(maxdepth)) maxdepth++; //IDDFS标志性的结构
1. 为啥不不直接用广度优先搜索呢?那是因为 IDDFS 有如下几个优势:
1.时间复杂度只比 BFS 稍差一点(虽然搜索 k+1 层时会重复搜索 k 层,但是整体而言并不比广搜慢很多)。
2.空间复杂度与深搜相同,却比广搜小很多。
3.利于剪枝(迭代加深本质上还是 DFS ,而 DFS 利于剪枝,BFS 不便于剪枝)。
2. 迭代加深是按照深度逐渐加深去搜索的,这就会导致产生大量重复搜索,那么如果重复搜索的太多,效率会不会比普通的 DFS 要低呢?
答案是不会的!因为普通的 DFS 的增长规模是指数级别的,我们重复搜索的 1 到 d-1 层的所有节点之和可能都没有第 d 层的节点多。
除了迭代加深之外,双向DFS也可以避免在深层子树上浪费时间,在一些题目中,问题不但具有“初态”,还具有明确的“终态”,并且从初态开始搜索与从终态开始逆向搜索产生的搜索树都能覆盖整个状态空间。在这种情况下,就可以采用双向搜索—-从初态和终态出发各搜索一半状态,产生两棵深度减半的搜索树,在中间交会,组合成最终的答案如下图所示,左侧是直接进行一次搜索产生的搜索树,右侧是双向搜索树,避免了层数过深时分支数量的大规模增长。