【问题标题】:Memoization Memory记忆记忆
【发布时间】:2014-02-25 08:39:50
【问题描述】:

记忆化绝对是一种强大的技术。

但是动态编程在 IMO 中稍微好一点,因为它不涉及内存紧张(在递归程序中,参数占用内存,并且随着我们深入递归,内存会增加)。但在速度方面,两者相当。

但绝对记忆化比动态编程更直接。

我的问题:有没有可能在没有内存限制的情况下使用记忆?

【问题讨论】:

  • (in a recursive program, the parameters occupy memory and this memory increases as we go deeper into the recursion) 这是一个常数因子。递归不可能大于 |Table| (其中 Table 是等效 DP 解决方案中使用的表),因此仅通过常数可能会更糟,并且就大 O 而言 - 它们是相同的。此外,记忆对稀疏矩阵更有用,因为你只创建“你需要的东西”,不像自下而上的 DP,你创建所有东西。
  • 所以,DP“稍微好一点”的说法基本上是错误的。每个都有其优点和缺点,每个解决方案(自下而上或自上而下)都在其他地方大放异彩。
  • Memoization 还有一个(缺点)优点是计算后的值会留在内存中。这是你的意思吗?另外,我认为这个问题更适合Programmers
  • 是的,但是DP的优势在哪里呢?\
  • @hypothesist 每次访问内存都快得多(记忆通常使用基于哈希的映射,平均为 O(1),但比数组访问慢)。这一事实使得自下而上的 DP 比自上而下的密集数据更好 - 一个常数,但常数很高。

标签: algorithm dynamic-programming memoization


【解决方案1】:

您可以将 DP 视为一种记忆形式,它受益于对发生何种访问模式的极其严格的保证。记忆是一个“拉”模型,其中最终答案请求其子部分,这些请求(间接)导致调用的计算的最小粒度。 DP 是一种“推送”模型,其中预测了每次计算所需的数据。

可以重新制定任何 DP 算法以使用惰性计算和记忆而不是表,有时甚至可以使结果实现在时间和空间复杂度上与 DP 相匹配。然而,第二个技巧通常归结为牢记 DP 实现并强制 memoization 实现“偶然发现”相同的访问模式。这是派对的把戏,而不是有用的转变。

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2011-08-25
    相关资源
    最近更新 更多