【问题标题】:How do you know when memoization should be used?你怎么知道什么时候应该使用记忆?
【发布时间】:2020-07-23 20:16:03
【问题描述】:

我正在学习记忆化,虽然我在 Python 中需要它时可以轻松实现它,但我仍然不知道如何识别需要它的情况。

我知道它是在子调用重叠时实现的,但是您如何确定是否是这种情况?在进行重叠调用之前,一些递归函数似乎已经深入。您如何在编码面试中识别这一点?你会抽出所有的调用(即使其中一些在 O(2^n) 复杂度蛮力解决方案中深入 5-6 层)?

像斐波那契数列这样的情况是有意义的,因为重叠会立即发生('fib(i-1)' 调用几乎会立即与 'fib(i-2)' 调用重叠)。但是对于其他情况,比如背包问题,我仍然无法理解任何人如何确定在面试时应该使用记忆。有没有快速检查重叠的方法?

我希望我的问题是有道理的。如果有人能给我指出一个好的资源,或者给我寻找线索,我将非常感激。提前致谢。

【问题讨论】:

  • 这不是非黑即白的。即使函数的时间复杂度在 O(1) 内,您可能仍希望记住它,以便在多次调用该函数时您不会执行两次相同的操作(例如,在同一事务中向您的用户计费两次)。至于面试问题(我不喜欢),如果您的算法具有指数时间复杂度,那么这是考虑记忆化的好兆头(假设满足其他条件)。背包和斐波那契是玩具示例,因此“每个人”都知道您可以实施记忆化以使它们“变得更好”。

标签: python memoization


【解决方案1】:

为了达到“记忆化”的解决方案,首先需要确定问题中的以下两个属性:

  1. 重叠子问题
  2. 最佳子结构

看来您确实了解 (1)。对于(2):

最优子结构:如果问题的最优解 S,大小为 n 可以通过只查看子问题的最优解来计算,s,大小

更多详情,请看下面的回答:

https://stackoverflow.com/a/59461413/12346373

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 2010-11-29
    • 2011-06-09
    • 1970-01-01
    • 2010-09-10
    • 2011-08-08
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多