2016-05-17 10 views
1

これらのメモ実装の違いは何か(存在する場合)?一方が他方に優先するユースケースはありますか?別の言い方をすればMemoization実装の違い - Python

を(私は、例として、この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 
+0

'in'と' not in'はほぼ同じ時間の複雑さを必要とするはずです。検索には 'O(1)'があり、キー値をハッシュしてからハッシュテーブルを探します。確かに見つけ出すために 'timeit'を試すことができます。 –

答えて

2

これらの実装では、パフォーマンスに大きな違いはありません。私の意見では、fib2は、より読みやすく/ pythonの実装であり、好ましいものでなければなりません。

私はなるだろうもう一つの勧告は、このような__init__でメモを初期化することです。

self.memo = {0:0, 1:1} 

これはそれぞれ、すべてのコールの内側の条件付きチェックをする必要性を回避し、あなたは、単に最初の二つを削除することができます今すぐfibメソッドの行。

関連する問題