DFS 、动态规划、回溯法、递归之间的关系是啥
首先DFS叫做深度优先搜索,既然是搜索,必然会有个起点,也会有个终点。
既然是深度优先,和BFS相比,DFS就是先一次性搜到底,再退一步,再走另一条路,再一次搜到底。想象一下你在迷宫,一个粗暴的方法就是把每条路径是试一遍。
那么DFS过程中,你要退一步,就必然需要保存你走过每个点的所有信息,而且是又先后顺序的,符合后进先出的规则,那么就需要用一个栈,而递归过程中函数调用会自动产生栈帧,当你的栈的深度越来越大的时候,栈也越来越大,如果递归没有终止条件,就会爆栈了。而在退一步的过程中,你需要从当前状态回到之前的状态,那么这步操作就是回溯,回溯是递归的时候一定会产生的很自然的操作,只不过大部分情况下不需要回溯。
如果你知道图,两个节点之间一条有向边连接,表示从这个点可以到那个点,那么你在DFS的过程中会产生一个图。
动态规划是设置边界,然后从起点开始,从起点根据转移方程把能到达的状态全都算一遍,最终再去获得那个目标节点的状态。通常一个状态可能由多个状态到达,所以会有状态叠加。一般使用for循环写方便简洁。而如果使用记忆化搜索,在DFS的过程中记录状态,找到目标后,看看如果想知道目标状态,这个目标状态依赖什么状态,就是谁能到达它那里,然后再去算它依赖的状态,然后再去看依赖的状态,不断递归,最终回到起点,答案也就出来了。两者的基础都是整个状态图,可以说记忆化搜索和动态规划是一个东西,而DFS只是一种搜索方式。而DFS同样可以不用递归,自己模拟栈实现。
总结:
递归是DFS的一种实现方式,DFS是动态规划的一种实现方式。回溯法是DFS过程中可以进行的可选操作,
■网友
现有的几个答案都不对啊。
递归就是自我调用,经常作为一种编程的实现方式,比如题主问题中的DFS 、动态规划、回溯法都可以用递归来实现,当然也可以用非递归来实现。很多时候一个概念也可以用递归的方式来定义(比如gnu)。
【DFS 、动态规划、回溯法、递归之间的关系是啥】 回溯是一种通用的算法,把问题分步解决,在每一步都试验所有的可能,当发现已经找到一种方式或者目前这种方式不可能是结果的时候,退回上一步继续尝试其他可能。很多时候每一步的处理都是一致的,这时候用递归来实现就很自然。
当回溯用于树的时候,就是深度优先搜索。当然了,几乎所有可以用回溯解决的问题都可以表示为树。那么这俩在这里就几乎同义了。如果一个问题解决的时候显式地使用了树,那么我们就叫它dfs。很多时候没有用树我们也管它叫dfs严格地说是不对的,但是dfs比回溯打字的时候好输入。别的回答里提到了砍枝,实际上这二者都可以砍枝。
至于动态规划,被题主放到这里是因为都是竞赛中经常会遇到并且学起来不容易明白吗?回溯可以用于所有用穷举法可以解决的问题,而DP只用于具有最优子结构的问题。所以不是所有问题都适合用dp来解决,比如八皇后。dp需要存贮子问题的解,回溯不需要。
■网友
我的分析顺序为
dp 与 recursion(递归)dp 与 dfs/backtrack(回溯)dfs 与 backtrackdfs/backtrack 与 recursion
动态规划的实质是记忆。这一点对理解动态规划很重要。这一论断需要问题同时满足两个条件。
可以记忆,即最优子结构,或称无后效性。具有此性质的问题均可以使用分治来解决(动态规划与贪心可以看作分治的特例),而分治几乎都是以递归的形式呈现的,故动态规划和贪心也可以用递归的方法解决(当然,用递推也可以;不过递归形式看起来清楚)。需要记忆,即重叠子问题。这就是它与深度优先搜索的主要区别。像八皇后问题,用dp也没问题,只是没有重叠子问题,用了 dp 也不能优化,反而浪费空间,还增加代码量。回溯与 dfs 类似。
推荐阅读
- 动态规划能得到一类问题的最优解,比如背包问题用动态规划来解决,怎样证明这个解就是相对应问题的最优解呢
- 怎样做内部审计系统,用于数据泄漏后的回溯
- bfs,dfs怎样保存路径?
- 怎样基于fastdfs搭建缩略图服务器
- 为啥hadoop 不直接采用 lustre 而要用hdfs
- 强化学习内动态规划中的算例求解
- 啥使用用广度搜索(bfs)啥时候用深度搜索(dfs)
- spark读取hdfs文件,block与executor?
- [焊接]特写:走近昆山“90后”科技创新“天团”
- 动态规划和贪心法的区别
