0.1 Amortisierte Analyse Nehmen wir an, wir haben nur eine Art von Operationen P auf einer Datenstruktur. Wenn T (n) die Zeit für n aufeinanderfolgende Operationen ist, beginnend mit der leeren Datenstruktur, dann ist die amortisierte Zeit T (n) n pro Operation. Methode 1 zur amortisierten Analyse: Berechne die gesamte Laufzeit T (n). Methode 2: Verwendung einer Potentialfunktion Φ, die von der der aktuellen Gestalt der Datenstruktur abhängt. TP = die tatsächliche Laufzeit der Operation P TP∗ = amortisierte Laufzeit TP − Φvor + Φnach Lemma: Wenn das Potential nie unter das Anfangspotential Φ0 sinkt, dann ist die amortisierte Laufzeit durch TP∗ beschränkt. Formeln: Φ0 −→ P1 Φ1 −→ P2 Φ2 Φ3 −→ P3 ... −→ Pn Φn TP1 + TP2 + . . . + Tn TP∗i = TPi − Φi−1 + Φi TP = TP∗i + Φi−1 + Φi " ! " ! " ! = TP∗1 + Φ0 − Φ1 + TP∗2 + Φ1 − Φ2 + · · · + TP∗n + Φn−1 − Φn ! " = TP∗1 + TP∗2 + · · · + TP∗n + ΦP − Φn # $% & TP1 + TP2 + . . . + Tn ≤0 ≤ TP∗1 + TP∗2 + ··· + TP∗n ≤ n · TP Die Einheiten von Φ sind “Laufzeit”, es präsentiert die angespannte Laufzeit. Eine Einheit von Φ reicht aus, um eine Operation mit konstanter Laufzeit zu bezahlen. Φ = (2 · n − n$ ) · const $ $ const − const · (2 · n − n ) + const · (2 · (n + 1) − n ) = 3 · const Tn→n+1 = const − const · (2 · n − n) + const · (2 · (n + 1) − n) = 2 · const # $% & # $% & 2 n Einfügen in (2,3)-Baum Φ = #Knoten vom Grad 3 Methode 3: 1 Φ wird in der Datenstruktur “gespeichert” (andere Betrachtungsweise von Methode 2). Jeder Knoten vom Grad 3 hat einen Taler gespeichert. Einfügen in einen (2,3)- Baum kostet konstante Zeit + 1 Taler für den Elternknoten. Der Temporärknoten vom Grad 4 hat 2 Taler gespeichert. Er bezahlt einen Taler, um den Knoten aufzuspalten und ein Taler wird an den Elternknoten weitergereicht. Beispiel: Fibonacci- Halden haben eine amortisierte Laufzeit O(1) für die Einfügeoperation und O (log n), um das Minimum zu entfernen. Das bedeutet, dass eine Folge von a einfüge- Operationen und b min-entfernen-Operationen höchstens a · O(1) + b · O (log n) = O (a + b · log n) dauert. tatsächliche Zeit: Manchmal kann amortisierte Laufzeit in eine Laufzeitschranke für den schlechtesten Fall umgewandelt werden. Zum Beispiel durch vorausarbeiten: 1. n = n! 2 +1 2. Es wird auf beide “Bänder” parallel geschrieben. Der Aufwand verdoppelt sich über konstante Zeit. Dies ist wichtig für Echtzeit- Anwendung, z.B. ein Atomkraftwerk. Methode 4: Bei dieser Methode werden die globalen Beziehungen zwischen den Operationen ausgenutzt. #Schleifendurchläufe ≤ #Pop-Operationen = n Die Laufzeit für alle Schleifendurchläufe = O(n) 2