【发布时间】:2016-09-14 04:44:11
【问题描述】:
这些记忆化实现之间有什么区别(如果有的话)?是否存在一个比另一个更可取的用例? (我以 Fibo 递归为例)
换一种说法:检查if some_value in self.memo: 和if some_value not in self.memo: 之间是否有区别,如果有,是否存在提供更好实现(更好地优化性能等)的情况?
class Fibo:
def __init__(self):
self.memo = {}
"""Implementation 1"""
def fib1(self, n):
if n in [0,1]:
return n
if n in self.memo:
return self.memo[n]
result = self.fib1(n - 1) + self.fib1(n - 2)
self.memo[n] = result
return result
"""Implementation 2"""
def fib2(self, n):
if n in [0,1]:
return n
if n not in self.memo:
result = self.fib2(n - 1) + self.fib2(n - 2)
self.memo[n] = result
return self.memo[n]
# Fibo().fib1(8) returns 21
# Fibo().fib2(8) returns 21
【问题讨论】:
-
in和not in应该需要大致相同的时间复杂度 - 检索是O(1)其中涉及的时间是散列键值,然后在底层散列表中查找散列.您可以随时尝试timeit来确定。
标签: python python-2.7 memoization