【发布时间】:2022-01-30 04:20:35
【问题描述】:
许多算法问题都可以通过 DFS 和动态规划来解决。这两种算法之间有直接或间接的联系吗?或者如果我想出了dp的子问题,如何将其转换为dfs中的递归函数?
【问题讨论】:
-
可能是太笼统了,但是我真的很困惑,为什么很多问题都可以用这两种算法解决?
标签: dynamic-programming microsoft-distributed-file-system
许多算法问题都可以通过 DFS 和动态规划来解决。这两种算法之间有直接或间接的联系吗?或者如果我想出了dp的子问题,如何将其转换为dfs中的递归函数?
【问题讨论】:
标签: dynamic-programming microsoft-distributed-file-system
DFS + 记忆 = DP
作为一个定义适用于许多问题。
根据动态规划的定义,它必须有"optimal substructure"。这意味着您可以使用子解决方案来获得通用解决方案。
换句话说,简单地说你将使用 f(n-1) 左右来表达 f(n)。这个递归表达式可以使用深度优先搜索直接编码。
为了利用预先计算的子解决方案或子结构,您可以使用 memoization 缓存子解决方案。 DP就是这样。
P.S.:当然你可以使用迭代循环的方法来填充缓存,而不是 DFS + memoization 的方法。但是要回答你的问题,这只会让它更难理解。
【讨论】:
动态编程是提高算法效率的一种方法,将其存储在内存中,或者应该说是记忆化。它可以与任何类型的算法结合使用,特别适用于示例 dfs 中的蛮力类型算法。
一个简单的例子是斐波那契。我假设您已经知道使用递归 (dfs) 求解斐波那契。
使用 dp,您将不再需要计算相同的值,因为您将存储该值(通常在数组中)。
示例伪代码:
//each arr default value will be 0
declare fibArr size n
fibArr[0] = 1
fibArr[1] = 1
function fib(int number)
{
//return the fibonacci number if it has been calculated beforehand
if(fibArr[number] != 0)
return fibArr[number]
fibArr[number] = fib(number-1) + fib(number-2)
return fibArr[number]
}
【讨论】: