【发布时间】:2014-05-20 00:57:22
【问题描述】:
我一直想知道这一点。没有任何书籍明确说明这一点。
回溯是探索所有可能性,直到我们发现一种可能性无法引导我们找到可能的解决方案,在这种情况下我们放弃它。
据我所知,动态编程的特点是子问题重叠。那么,动态编程可以说是使用缓存回溯(对于以前探索过的路径)吗?
谢谢
【问题讨论】:
-
你所指的,使用缓存回溯通常称为“memoization”。记忆具有动态编程的大部分好处,而且痛苦少得多。 DP 和 Memoization 之间的主要区别在于 DP 使用 最佳 递归顺序,这通常需要证明它是最佳的。为了记录,动态规划是人们可以选择的最俗气的名字编程的“类型”。
-
@ldog: 记忆化是实现 DP 的一种方式,并且在每种情况下都会产生最多个子问题来解决(因为自下而上的 DP,你循环将它们全部填满的表格单元格可能会计算出您实际上不需要的子问题的解决方案)。如果您需要解决所有或大部分子问题,自底向上通常是一个较小的常数因子,速度更快,因为您可以避免将堆栈推入/弹出以进行递归以及记忆化解决方案中的
if (notAlreadyComputed)测试。 -
@ldog:“动态编程”中的“编程”是一个古老的术语,意思是“使用表格”,而不是与计算机有关。在“线性规划”这个短语中可以看到相同的词源。
-
我认为到目前为止的答案中缺少一个要点:DP 从不做“回溯”,如递归到非最优子树。所以缓存和记忆 DP 之间有一个类比,但是在设计高效算法时要避免回溯
-
显然,“动态规划”这个名字太俗气了,因为算法的发明者是hiding from his boss,他正在做数学研究。
标签: algorithm theory dynamic-programming backtracking