日记
2024.5.5
在C++编程中,DFS(深度优先搜索,Depth-First Search)和DP(动态规划,Dynamic Programming)是两种完全不同的算法和技术,它们用于解决不同类型的问题。
DFS(深度优先搜索)
DFS是一种用于遍历或搜索树或图的算法。这种算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
DFS经常用于图的连通性测试、拓扑排序、寻找强连通分量等。
DP(动态规划)
DP是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
在动态规划中,基本思想是将原问题分解为相似的子问题,在求解的过程中保存子问题的解,当再次需要求解此子问题时,直接利用保存的结果,从而避免了大量的重复计算。这种方法通常用于优化递归问题,如背包问题、最短路径问题、项目调度问题等。
区别
应用场景:DFS通常用于图的遍历和搜索问题,而DP则用于优化具有重叠子问题和最优子结构性质的问题。
存储需求:DFS在搜索过程中通常不需要保存中间结果,因为它会回溯到之前的节点。而DP则需要保存子问题的解,以便在需要时直接使用。
时间复杂度:DFS的时间复杂度通常取决于图的结构和搜索策略,可能是O(V+E)(其中V是顶点数,E是边数)。而DP的时间复杂度取决于子问题的数量和求解每个子问题所需的时间。
空间复杂度:DFS的空间复杂度通常是O(V)(用于存储栈或递归调用栈)。DP的空间复杂度可能更高,因为它需要存储所有子问题的解。然而,通过使用滚动数组或记忆化搜索等技术,可以优化DP的空间复杂度。
解决问题类型:DFS主要用于图的遍历和搜索问题,而DP则更侧重于优化和决策制定问题。