本文主要是介绍0x24 迭代加深,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
0x24
迭代加深
1.迭代加深
深度优先搜索每次选定一个分支,不断深入,直至到达递归边界才回溯。这种策略带有一定的缺陷。试想以下情况:搜索树每个节点的分支数目非常多,并且问题的答案在某个较浅的节点上。如果深搜在一开始就选错了分支,就很可能在不包含答案的深层子树上浪费许多时间。
此时,我们可以从小到大限制搜索的深度,如果在当前深度限制下搜不到答案,就把深度限制增加,重新进行一次搜索,这就是迭代加深的思想。所谓“迭代”,就是以上一次的结果为基础,重新执行以逼近答案的意思。迭代加深 D F S DFS DFS的过程如下:
虽然该过程在深度限制为 d d d时,会重复搜索第 1 ∼ d − 1 1\sim d-1 1∼d−1层的节点,但是当搜索树节点分支数目较多时,随着层数的深入,每层节点数会呈指数级增长,这点重复搜索与深层子树的规模相比,实在是小巫见大巫了。
总而言之,当搜索树规模随着层次的深入增长很快,并且我们能够确保答案在一个较浅层的节点时,就可以采用迭代加深的深度优先搜索算法来解决问题。
2.双向搜索
除了迭代加深之外,双向搜索也可以避免在深层子树上浪费时间。在一些题目上,问题不但有“初态”,还具有明确的“终态”,并且从初态开始搜索与从终态开始逆向搜索产生的搜索树都能覆盖这个状态空间。在这种情况下,就可以采用双向搜索——从初态到终态出发各搜索一半状态,产生两颗深度减半的搜索树,在中间交会、组合成最终的答案。
如下图所示,左侧是直接进行一次搜索产生的搜索树,右侧是双向搜索产生的两颗搜索树,避免了层数过深时分支数量的大规模增长。
这篇关于0x24 迭代加深的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!