关于DP的书籍解释(你能解释一下这个文字吗?)

时间:2014-09-06 09:25:25

标签: algorithm dynamic-programming interpretation

这是本书的一段:算法导论,第3版。 p.336

  

“这些两种方法会产生具有相同渐近运行时间的算法,    在不寻常的情况下,预期自上而下的方法实际上并不存在   递归检查所有可能的子问题。自下而上的方法通常有   更好的常数因素,因为它减少了程序调用的开销。“

背景:两种方法首先是自上而下+记忆(DP),第二种 自下而上的方法。


我再问你一个问题。函数调用的“开销”是否意味着每个函数调用都需要时间?即使我们解决了所有子问题,由于“开销”,自上而下需要更多时间?

1 个答案:

答案 0 :(得分:4)

动态编程的自下而上方法首先解决所有小问题,然后使用它们找到下一个最小的问题,依此类推。因此,例如,如果长度为n的问题的解决方案仅取决于长度为n-1的问题的答案,那么您可以从长度为0的所有解决方案开始,然后您将迭代地填写长度为1的解决方案,2,3等,每次使用你在上一级计算过的答案。这是有效的,因为它意味着你最终不会两次解决子问题。

带有记忆方法的自上而下会以另一种方式看待它。如果您想要解决长度为10的问题,那么您可以递归地执行此操作。你注意到它依赖于(比如说)长度为9的三个问题,所以你递归地解决它们,然后你就知道长度为10的答案。但是每当你解决一个子问题时,你都记得回答,无论何时你需要解决一个子问题,你首先要看看你是否已经解决了它,如果有的话,你会返回缓存的答案。

自下而上的方法很好,因为它可以迭代编写(使用for循环)而不是递归编写,这意味着你不会在大问题上耗尽堆栈空间,并且循环也更快。它的缺点是你解决了所有的子问题,你可能不需要它们全部解决,以解决你想要答案的大问题。

如果由于递归开销而需要解决所有子问题,那么自上而下的方法会更慢。但是如果你要解决的问题只需要解决一小部分子问题就会更快,因为它只能解决它所需要的问题。

急切评估(自下而上)和懒惰评估(自上而下)之间的差异基本相同。