记忆和dynamic编程有什么区别?

我认为dynamic编程是记忆的一个子集。 这样对吗?

记忆和dynamic编程有什么区别?

记忆是一个描述优化技术的术语,用于caching先前计算的结果,并在需要再次进行相同的计算时返回caching的结果。

dynamic规划是一种recursion求解问题的技术,适用于子问题计算重叠的情况。

dynamic编程通常使用制表来实现,但也可以使用记忆来实现。 正如你所看到的,没有一个是另一个的“子集”。


一个合理的后续问题是: 列表(典型的dynamic编程技术)和记忆之间有什么区别?

当你使用列表解决dynamic规划问题时,你可以解决“ 自下而上 ”的问题,即首先解决所有相关的子问题,通常是填充一个n维表。 根据表中的结果,然后计算“最高”/原始问题的解决scheme。

如果你使用memoization来解决问题,你可以通过维护已经解决的子问题的地图来完成。 你首先解决“顶级”问题(通常是recursion解决子问题)的意义上,它是“自上而下”的。

这里的一个很好的幻灯片(链接现在已经死了,幻灯片仍然不错):

  • 如果所有的子问题都必须至less解决一次,那么自下而上的dynamic规划algorithm通常比自顶向下的memoizedalgorithm优于常数因子
    • 没有用于recursion的开销和维护表的更less的开销
    • 有一些问题可以利用dynamic规划algorithm中的表格访问规则模式来进一步减less时间或空间要求
  • 如果子问题空间中的某些子问题根本不需要解决,则该解决scheme的优点是只能解决那些绝对需要的子问题

其他资源:

  • 记忆 , dynamic规划
  • 相关SO Q / A: dynamic规划的记忆或制表方法

这已被改写为一篇文章在这里 。

dynamic规划是一种algorithm范式,通过将其分解为子问题来解决给定的复杂问题,并存储子问题的结果以避免再次计算相同的结果。

http://www.geeksforgeeks.org/dynamic-programming-set-1/

Memoization是跟踪以前解决的解决scheme(通常实现为散列键值对,而不是通常基于数组的列表)的简单方法,以便在再遇到它们时不会重新计算。 它可以用于自下而上或自上而下的方法。

请参阅关于记忆与制表的讨论。

用于dynamic编程的记忆或列表方法

所以dynamic规划是一种解决某些types的问题的方法,通过解决recursion关系/recursion和通过列表或记忆来存储以前find的解决scheme。 记忆是一种跟踪以前解决的问题的解决scheme,可以用于具有给定input集合的唯一确定性解决scheme的任何函数。

dynamic编程通常被称为Memoization!

  1. 记忆是自上而下的技术(通过分解来解决给定的问题),dynamic规划是自下而上的技术(从平凡的子问题开始解决,直到给定的问题)

  2. DP从基本情况开始寻找解决scheme并向上工作。 DP解决了所有的子问题,因为它是自下而上的

    不像Memoization,它只解决了所需的子问题

  3. DP有可能将指数时间蛮力解转化为多项式时间algorithm。

  4. DP可能效率更高,因为它是迭代的

    相反,Memoization必须支付由recursion引起的(经常是重要的)开销。

为了更简单,Memoization使用自上而下的方法来解决问题,即从核心(主要)问题开始,然后将其分解成子问题并类似地解决这些子问题。 在这种方法中,同样的子问题可能会发生多次,消耗更多的CPU周期,从而增加了时间复杂度。 而在dynamic编程中,相同的子问题不会被多次解决,而是使用前面的结果来优化解决scheme。

(1)在概念上 ,记忆和DP是真的一回事。 因为:考虑DP的定义:“重叠子问题”和“最优子结构”。 备忘录完全拥有这2个。

(2)记忆是DP与堆栈溢出的风险是recursion很深。 DP自下而上没有这个风险。

(3)记忆需要一个哈希表。 所以额外的空间和一些查找时间。

所以要回答这个问题:

从概念上讲 ,(1)意味着它们是相同的东西。

– 考虑到(2),如果你真的想,记忆是DP的一个子集,从某种意义上讲,记忆可以解决的问题可以被DP解决,但是DP可以解决的问题可能不能通过记忆解决(因为它可能会堆栈溢出)。

考虑到(3),它们在性能上有微小的差别。

从维基百科:

记忆化

在计算中,记忆是一种优化技术,主要用于通过函数调用来避免重复计算以前处理的input的结果来加速计算机程序。

dynamic编程

在math和计算机科学中,dynamic规划是将复杂问题分解成更简单的子问题的一种方法。

当把一个问题分解成更小更简单的子问题时,我们经常会遇到同样的子问题 – 所以我们使用Memoization来保存之前的计算结果,所以我们不需要重复它们。

dynamic编程通常会遇到使用记忆的情况,但是您可以使用其中一种技术,而不必使用其他技术。