【发布时间】:2020-07-23 20:16:03
【问题描述】:
我正在学习记忆化,虽然我在 Python 中需要它时可以轻松实现它,但我仍然不知道如何识别需要它的情况。
我知道它是在子调用重叠时实现的,但是您如何确定是否是这种情况?在进行重叠调用之前,一些递归函数似乎已经深入。您如何在编码面试中识别这一点?你会抽出所有的调用(即使其中一些在 O(2^n) 复杂度蛮力解决方案中深入 5-6 层)?
像斐波那契数列这样的情况是有意义的,因为重叠会立即发生('fib(i-1)' 调用几乎会立即与 'fib(i-2)' 调用重叠)。但是对于其他情况,比如背包问题,我仍然无法理解任何人如何确定在面试时应该使用记忆。有没有快速检查重叠的方法?
我希望我的问题是有道理的。如果有人能给我指出一个好的资源,或者给我寻找线索,我将非常感激。提前致谢。
【问题讨论】:
-
这不是非黑即白的。即使函数的时间复杂度在 O(1) 内,您可能仍希望记住它,以便在多次调用该函数时您不会执行两次相同的操作(例如,在同一事务中向您的用户计费两次)。至于面试问题(我不喜欢),如果您的算法具有指数时间复杂度,那么这是考虑记忆化的好兆头(假设满足其他条件)。背包和斐波那契是玩具示例,因此“每个人”都知道您可以实施记忆化以使它们“变得更好”。
标签: python memoization