深度优先搜索涉及到的概念

1. 回溯
递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧
全排列的交换法,数独,部分和,用到了回溯

下一个状态在开始之前需要利用到之前的状态,此时需要进行回溯,因为之前的状态对现在的状态存在着影响

 

2. 剪枝
深度优先搜索的时候如果已经明确从当前状态无论如何转移都不会存在(更优)解,就应该终止往下的继续搜索,这种方法叫做剪枝
数独和部分和里面有剪枝:属于隐性的剪枝,当尝试去填一个数字的时候发现某些数字不行那么会把这个这条支路给剪断

当使用if条件的时候把限定条件加进去然后在if里面使用调用dfs,这也是剪枝的一种

高级的剪枝在调用dfs之前对情况进行预判来进行提前剪枝

回溯与剪枝的过程中可能存在着多个平行的状态,我们需要清楚知道这些平行状态退回来的状态,清楚这些状态之后我们才可以对它们进行进一步的处理以便得到我们的目标答案。像部分和的例子,就存在着两个平行的状态,可以选择两种思路去考虑,第一种思路是一开始对于当前的元素我们可以选择要,也可以选择不要,第二种思路是我们一开始的时候选择不要,也可以选择要

但是对于这两种思路支路退来的时候的对于接下来的处理是不一样,第一种先选择要,当退回来这层的时候说明我们选择的当前的元素不能组成目标元素,我们需要在这层返回之后清除原来加入的那个元素,然后进入下一个状态进行搜索,而对于我们第二种思路刚开始的时候先选择不要,那么退回来的时候说明选择不要这种情况不能组成情况所以需要把当前的元素假如进来,当退回到要这个状态的时候说明上面平行状态下加入的元素不符合,所以需要清除掉

所以对于不同的思路对于退回来的时候的状态的处理是不一样的,但是有一点是相同的是退回来的时候表示当前的状态不符合,需要往相反的情况考虑

 

3. dfs这一层调用返回之后那么它才会执行这一层下面的代码然后进入for循环的下一个状态,搜索它的兄弟是否满足条件,所有dfs会搜索完所有的可能,走遍所有的路径

 

4. dfs调用碰到return的执行情况

例如执行dfs(s, 5)而此时5为dfs的出口那么它会退回去但是不会执行dfs(s, 5)下面的代码,会退到上一层dfs(s, 4)并且执行dfs(s, 4)语句下面的代码,即当某一个dfs调用的时候碰到递归出口那么它会回退到当前的状态(即调用的这一层,其中的参数对应着这一层的参数)执行这句代码下面的代码,每一层退出来之后都是这样执行的,我们可以在调用dfs前后使用输出语句来进行观察和理解

dfs调用的过程实际上就是模拟一棵树往下延伸的过程,走到底之后再往右边延伸,直到所有的路径走完了,那么就退出dfs了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值