„Memoisation“ – Versionsunterschied

[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Luckas-bot (Diskussion | Beiträge)
K [r2.5.2] Bot: Ergänze: nl:Memoization
Zeile 10: Zeile 10:
Das Wort ''Memoisation'' wird oft mit dem englischen Wort ''Memorization'' verwechselt, welches eine ähnliche Bedeutung aufweist.
Das Wort ''Memoisation'' wird oft mit dem englischen Wort ''Memorization'' verwechselt, welches eine ähnliche Bedeutung aufweist.


==Beispiel==
== Beispiel ==
Ein einfaches Programm, das die [[Fibonacci-Zahlen]] berechnet, ist
Ein einfaches Programm, das die [[Fibonacci-Zahlen]] berechnet, ist
:<code>fib(n) {

::if n <= 2, return 1;
fib(n) {
::return fib(n-1) + fib(n-2);
if n <= 2, return 1;
:}</code>
return fib(n-1) + fib(n-2);
}

(Dieses Beispiel soll keine effiziente Implementierung darstellen. Es dient ausschließlich der Illustration der Memoisation.)
(Dieses Beispiel soll keine effiziente Implementierung darstellen. Es dient ausschließlich der Illustration der Memoisation.)


Weil fib() mit denselben Parametern mehrmals aufgerufen wird, ist die Laufzeit der Funktion größer als [[O-Notation|O]](1.6<sup>n</sup>). Falls man die Werte von fib(n) bei der ersten Berechnung "memoisiert" und die Speicherreservierung und -initialisierung in [[O-Notation|O]](n) vorgenommen werden kann, sinkt die Laufzeit auf [[O-Notation|O]](n).
Weil fib() mit denselben Parametern mehrmals aufgerufen wird, ist die Laufzeit der Funktion größer als [[O-Notation|O]](1.6<sup>n</sup>). Falls man die Werte von fib(n) bei der ersten Berechnung "memoisiert" und die Speicherreservierung und -initialisierung in [[O-Notation|O]](n) vorgenommen werden kann, sinkt die Laufzeit auf [[O-Notation|O]](n).


Speicher für Memo-Array memo reservieren und alle Werte darin auf 0 setzen;
:<code>Speicher für Memo-Array memo reservieren und alle Werte darin auf 0 setzen;
Initialisiere memo[1] und memo[2] auf 1;
:Initialisiere memo[1] und memo[2] auf 1;</code>



fib(n) {
:<code>fib(n) {
if memo[n] is not zero, return memo[n];
::if memo[n] is not zero, return memo[n];
memo[n] = fib(n-1) + fib(n-2);
::memo[n] = fib(n-1) + fib(n-2);
return memo[n];
::return memo[n];
:}</code>
}


== Geschichte ==
== Geschichte ==

Version vom 18. März 2011, 15:14 Uhr

Memoisation ist eine Technik, um Computerprogramme zu beschleunigen, indem Rückgabewerte von Funktionen zwischengespeichert anstatt neu berechnet werden. Memoisation ähnelt Dynamischer Programmierung, bewahrt jedoch im Gegensatz zu dieser die grundlegende Vorgehensweise des zu beschleunigenden Verfahrens.

Funktionen können nur „memoisiert“ werden, wenn sie referenziell transparent sind, d. h. sie geben bei gleichen Eingaben immer dieselben Ausgaben zurück. Operationen, die nicht referenziell transparent sind, aber wo Abweichungen in der Ausgabe relativ selten zu erwarten sind, können mit anderen Methoden (wie Cache) zwischengespeichert werden. Generell haben "memoisierte" Ausgaben kein Ablaufdatum und müssen nicht neu berechnet werden, wie das bei Caches im Allgemeinen der Fall ist. In imperativen Programmiersprachen wird Memoisation üblicherweise in Form eines assoziativen Arrays implementiert.

In einer funktionalen Programmiersprache ist es möglich eine Funktion höherer Ordnung memoize für jede referenziell transparente Funktion zu konstruieren. In Sprachen ohne die Möglichkeit einer Funktion höherer Ordnung muss die Memoisation separat in jede Funktion implementiert werden, die davon Gebrauch macht.

Etymologie

"Memoisation" ist aus dem lateinischen Wort Memorandum abgeleitet, was so viel wie "das zu Erinnernde" bedeutet. Im allgemeinen Sprachgebrauch wird Memorandum auch Memo genannt und man kann Memoisation als "eine Funktion in eine Memo umwandeln" verstehen.

Das Wort Memoisation wird oft mit dem englischen Wort Memorization verwechselt, welches eine ähnliche Bedeutung aufweist.

Beispiel

Ein einfaches Programm, das die Fibonacci-Zahlen berechnet, ist

fib(n) {
if n <= 2, return 1;
return fib(n-1) + fib(n-2);
}

(Dieses Beispiel soll keine effiziente Implementierung darstellen. Es dient ausschließlich der Illustration der Memoisation.)

Weil fib() mit denselben Parametern mehrmals aufgerufen wird, ist die Laufzeit der Funktion größer als O(1.6n). Falls man die Werte von fib(n) bei der ersten Berechnung "memoisiert" und die Speicherreservierung und -initialisierung in O(n) vorgenommen werden kann, sinkt die Laufzeit auf O(n).

Speicher für Memo-Array memo reservieren und alle Werte darin auf 0 setzen;
Initialisiere memo[1] und memo[2] auf 1;


fib(n) {
if memo[n] is not zero, return memo[n];
memo[n] = fib(n-1) + fib(n-2);
return memo[n];
}

Geschichte

Das englische Wort „memoization“ entstand 1968 durch Donald Michie aus seinem Artikel „Memo functions and machine learning“ in der Zeitschrift Nature.

Literatur