La mémorisation fait effectivement référence au fait de se souvenir ("memoization" → "memorandum" → se souvenir) des résultats des appels de méthode en fonction des entrées de la méthode, puis de renvoyer le résultat mémorisé plutôt que de calculer à nouveau le résultat. Vous pouvez l'imaginer comme un cache pour les résultats des méthodes. Pour plus de détails, reportez-vous à la page 387 pour la définition en Introduction aux algorithmes (3e), Cormen et al.
Un exemple simple pour calculer des factorielles en utilisant la mémorisation en Python serait quelque chose comme ceci :
factorial_memo = {}
def factorial(k):
if k < 2: return 1
if k not in factorial_memo:
factorial_memo[k] = k * factorial(k-1)
return factorial_memo[k]
Vous pouvez être plus compliqué et encapsuler le processus de mémorisation dans une classe :
class Memoize:
def __init__(self, f):
self.f = f
self.memo = {}
def __call__(self, *args):
if not args in self.memo:
self.memo[args] = self.f(*args)
#Warning: You may wish to do a deepcopy here if returning objects
return self.memo[args]
Entonces:
def factorial(k):
if k < 2: return 1
return k * factorial(k - 1)
factorial = Memoize(factorial)
Une fonction connue sous le nom de " décorateurs " a été ajouté dans Python 2.4, ce qui vous permet maintenant d'écrire simplement ce qui suit pour accomplir la même chose :
@Memoize
def factorial(k):
if k < 2: return 1
return k * factorial(k - 1)
En Bibliothèque de décorateurs Python possède un décorateur similaire appelé memoized
qui est légèrement plus robuste que le Memoize
montré ici.
286 votes
Lorsque la deuxième phrase de l'article pertinent de wikipedia contient la phrase "mutually-recursive descent parsing[1] in a general top-down parsing algorithm[2][3] that accommodates ambiguity and left recursion in polynomial time and space," je pense qu'il est tout à fait approprié de demander à SO ce qui se passe.
14 votes
@Clueless : Cette phrase est précédée de "La mémorisation a également été utilisée dans d'autres contextes (et à des fins autres que les gains de vitesse), comme dans". Donc, c'est juste une liste d'exemples (et n'a pas besoin d'être compris) ; ça ne fait pas partie de l'explication de la mémoïsation.
0 votes
Voici une bonne explication avec des exemples attachés de la mémorisation et comment l'incorporer dans un décorateur : pycogsci.info/?p=221
1 votes
@StefanGruenwald Ce lien est mort. Pouvez-vous trouver une mise à jour ?
3 votes
Nouveau lien vers le fichier pdf, puisque pycogsci.info est en panne : people.ucsc.edu/~abrsvn/NLTK_parsing_demos.pdf
0 votes
Vous pouvez consulter mon article de blog à l'adresse u8y7541.github.io/blog_posts/lambdas_recursion_memoizing.html.
7 votes
@Clueless, L'article dit en fait " simple mutually-recursive descent parsing [1] in a general top-down parsing algorithm [2] [3] that accommodates ambiguity and left recursion in polynomial time and space". Vous avez manqué le simple ce qui rend évidemment cet exemple beaucoup plus clair :).
1 votes
En voyant le nombre de personnes qui ont répondu et qui répondent encore à cette question, je crois à l'effet "Bike Sheld". fr.wikipedia.org/wiki/Loi_de_trivialité