DFS剪枝技巧

DFS剪枝技巧

剪枝,就是为了减小搜索树的规模,尽早排除搜索树中不必要的分支的一种手段。

搜索树的概念:==所有点(问题空间中的状态)成功发生递归的边(访问两个状态之间的移动)==构成的树。

在DFS中,常用的搜索方法如下:

1.优化搜索顺序

在一些搜索问题中,搜索树的各个层次、各个分支之间的顺序不是固定的。不同的搜索顺序会产生不同的搜索树形态,其规模大小也想相差甚远。

2.排除等效冗余

在搜索过程中,如果我们能够判定从搜索树的当前节点上沿着几条不同分支到达的子树等效的,那么只需要对其中的一条分支执行搜索即可。

3.可行性剪枝

在搜索过程中,及时对当前状态进行检查,如果发现分支已经无法到达递归边界,就执行回溯。这就好比我们在道路上行走时,远远看到前方是一个死胡同,就应该立即折路返回了,而不是走到路的尽头再返回。

4.最优性剪枝

在最优化问题的搜索过程中,如果当前花费的代价已经超过了当前搜到的最优解,那么无论采取多么有些的策略到达递归边界,都不可能更新答案了。此时可以停止对当前分支的搜索,执行回溯了。比如说,前面搜索过的好多分支中得到了一个最优解答案是ans,然后搜索当前分支时,当发现在某个节点时,它的答案res已经大于了我们的最优解答案ans,那么如果继续搜索这个分支的剩余部分,那么得到的答案肯定是远远大于最优解答案ans的。因此,我们需要提前退出搜索这个分支。

5.记忆化搜索

可以记录每个状态的搜索结果,在重复遍历一个状态时直接检索并返回。这就好比我们对图进行深度优先遍历时,标记一个节点是否已经被遍历过。


在DFS中,有两种可能的递归边界,取决于不同的写法:假设有n个元素

  • 如果写成u=0,从0开始进入递归,那么递归边界就是 u = = n u==n u==n,因为u从0到n-1就是n个元素,也就是说当遍历到 u = = n u==n u==n时,实际上是在递归第n+1个元素了,那么前n个元素也就是已经递归完成了,因此当进入第n+1个元素的递归时,就是递归的边界。不能写成 u = = n − 1 u==n-1 u==n1,因为u从0到n-2只有n-1个元素,但是我们没有对第n个元素递归,所以这样写就会漏掉最后一个元素了。
  • 如果写成u=1,那么从1开始进入递归,那么递归边界就是 u = = n + 1 u==n+1 u==n+1,因为从1到n就是n个元素,也就是说当遍历到 u = = n + 1 u==n+1 u==n+1时,实际上是在递归第n+1个元素了,那么前n个元素也就是已经递归完成了,因此当进入第n+1个元素的递归时,就是递归的边界。不能写成 u = = n u==n u==n,因为从1到n-1只有n-1个元素,但是我们没有对第n个元素递归,所以这样写就会漏掉最后一个元素了。

你可能感兴趣的:(算法提高)