Timo Bingmann, Christian Schulz INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS 1 KIT Timo Universität Bingmann, des LandesChristian Baden-Württemberg Schulz und nationales Forschungszentrum in der Helmholtz-Gemeinschaft Institut für Theoretische www.kit.edu Informatik
Amortisierte Analyse Beispiel Binärzähler 000 0 2 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler 000 0 001 1 2 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler 000 0 001 1 010 2 2 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler 000 0 001 1 010 2 011 3 2 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler 000 0 001 1 010 2 011 3 100 4 2 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler 000 0 001 1 010 2 011 3 100 4 101 5 2 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler 000 0 001 1 010 2 011 3 100 4 101 5...β 2 β 1 β 0 i β i 2 i 2 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler Binärzähler: zähle von 0 bis m m Inkrementoperationen x = i β i2 i Function binary-increment() : β 0 β 0 + 1 i=0 : N 0 while β i = 2 do β i+1 β i+1 + 1 β i 0 i i + 1 000 0 001 1 010 2 011 3 100 4 101 5...β 2 β 1 β 0 i β i 2 i 3 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001111111 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001111111 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001111112 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001111120 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001111200 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001111200 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001112000 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001120000 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 001200000 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 002000000 4 Timo Bingmann, Christian Schulz
Beispiel Binärzähler binary-increment 001111111 010000000 4 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler 1 Kostenmodell: Jedes gekippte Bit kostet 1 2 jedes Bit einzeln Kippen! Operation Kosten 000 001 1 001 010 2 010 011 1 011 100 3 01 k 10 k k + 1 cost(i i + 1) 1 + Anzahl der endenden Einsen in bin(i) 5 Timo Bingmann, Christian Schulz
Amortisierte Analyse Beispiel Binärzähler T (m) seien Gesamtkosten für m Operationen amortisierten Kosten pro Operation definiert als T (m)/m amortisierten Kosten einer Inkrementoperation? a) O(1) b) O(log m) c) O(m) 6 Timo Bingmann, Christian Schulz
Beispiel Binärzähler Aggregatmethode Kochrezept: Schätze T (m) direkt ab Operation Kosten 0000 0001 1 0001 0010 2 0010 0011 1 0011 0100 3 0100 0101 1 0101 0110 2 0110 0111 1 0111 1000 4... Beobachtung (m Ops): β 0 jedes mal gekippt β 1 jedes zweite mal gefoppt β 2 jedes vierte mal gefoppt β 3 jedes achte mal gefoppt... = m = m 2 = m 4 = m 8 T (m) m + m 2 + m 4 + m 8... i=0 m 2 j = 2m 7 Timo Bingmann, Christian Schulz
Beispiel Binärzähler Aggregatmethode Kochrezept: Schätze T (m) direkt ab Operation Kosten 0000 0001 1 0001 0010 2 0010 0011 1 0011 0100 3 0100 0101 1 0101 0110 2 0110 0111 1 0111 1000 4... Beobachtung (m Ops): β 0 jedes mal gekippt β 1 jedes zweite mal gefoppt β 2 jedes vierte mal gefoppt β 3 jedes achte mal gefoppt... = m = m 2 = m 4 = m 8 T (m) m 2 = O(1) 7 Timo Bingmann, Christian Schulz
Beispiel Binärzähler Bankkontomethode 1 Allgemein: t 1,..., t m die Laufzeiten der Einzeloperationen 2 t i Gebühr für i-te Operation 3 vor jeder Operation erhält Algorithmus Gehalt G 4 alle Operationen müssen aus Gehältern bezahlt werden 8 Timo Bingmann, Christian Schulz
Beispiel Binärzähler Bankkontomethode 1 finde Gehalt G + Sparstrategie mit T (m) mg 2 Binärzähler: G = 2, Strategie: Zählvorgang genau ein Bit auf 1 gesetzt, dies kostet 1 Euro 9 Timo Bingmann, Christian Schulz
Beispiel Binärzähler Bankkontomethode 1 finde Gehalt G + Sparstrategie mit T (m) mg 2 Binärzähler: G = 2, Strategie: Zählvorgang genau ein Bit auf 1 gesetzt, dies kostet 1 Euro anderer Euro wird gespart, um Bit auf 0 zu setzen 9 Timo Bingmann, Christian Schulz
Beispiel Binärzähler Bankkontomethode 1 finde Gehalt G + Sparstrategie mit T (m) mg 2 Binärzähler: G = 2, Strategie: Zählvorgang genau ein Bit auf 1 gesetzt, dies kostet 1 Euro anderer Euro wird gespart, um Bit auf 0 zu setzen 3 Analyse: zum Zeitpunkt i: k-mal rücksetzen auf 0 und einmal Bit setzen finanziert durch k Euro aus dem Konto und 1 Euro Gehaltseingang 9 Timo Bingmann, Christian Schulz
Beispiel Binärzähler Einzelkosten Cost(i) 5 4 3 2 1 Op 10 Timo Bingmann, Christian Schulz
Beispiel Binärzähler Summierte Kosten T(m) 11 10 9 8 7 6 5 4 3 2 1 11 Timo Bingmann, Christian Schulz Op
Beispiel Binärzähler Summierte Kosten 2m T(m) 11 10 9 8 7 6 5 4 3 2 1 12 Timo Bingmann, Christian Schulz Op
Beispiel Binärzähler T (m)/m 2 T(m) m 5 4 3 2 1 Op 13 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur wichtige Operationen: lookup(key k) : Data insert(key k, Data d) delete(key k) Ziel: Datenstruktur in der Operationen in amortisiert O ( n ) 14 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur Lookup wichtige Operationen: lookup(key k) : Data insert(key k, Data d) delete(key k) n n linear lookup(key k) in o(n) Elemente nicht komplett unsortiert 15 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur Lookup lookup(key k) : Data Vorgehen: durchsuche die Hotlist komplett durchsuche das geordnete Array mit binärer Suche n n Laufzeit: O ( n ) + O(log n) = O ( n ) 16 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur insert insert(key k, Data d) n Fall A: in Hotlist ist Platz nächste freie Position in Hotlist n Laufzeit: O(1) 17 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur insert insert(key k, Data d) Fall B: in Hotlist ist kein Platz sortiere Hotlist merge: führe sortierte Listen zusammen k erstes Element in neuer Hotlist Laufzeit: O ( n log( n) ) + O(n) = O(n) n n n + n 18 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur Amortisierung nach Zusammenführung sind n 1 Positionen in der Hotlist frei n insert-operationen bis zur nächsten Zusammenführung Zusammenführung hat Aufwand cn Also: spare bei jeder einfachen insert-operation c n an bezahle bei der letzten Operation cn 19 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur delete delete(key k): jedes Element bekommt valid -Bit lookup: suche k setze valid -Bit auf 0 Löschoperationen selten Laufzeit: O ( n ) + O(log n) = O ( n ) n n 20 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur delete delete(key k): bei mehr als O(1) Lösch-Ops zwischen zwei Zusammenführungen n Vorgehen ähnlich zu insert Reorganisation nach O ( n ) Lösch-Ops lookup funktioniert noch mit gleicher Laufzeit n Laufzeit: Analyse wie bei insert 21 Timo Bingmann, Christian Schulz
Beispiel Hotlist-Datenstruktur amortisierter Aufwand lookup(key k): Aufwand in O ( n ) insert(key k): Aufwand amortisiert in O ( n ) delete(key k): Aufwand amortisiert in O ( n ) 22 Timo Bingmann, Christian Schulz
Unbounded Array Wieviele Speicherzellen braucht ein Unbounded Array gleichzeitig für n Elemente? Worst-Case-Betrachtung es darf eine beliebige Folge von pushback und popback Operationen vorausgegangen sein a) 2n ± c b) 3n ± c c) 4n ± c d) 6n ± c 23 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 Aufwand bisher: reallocate(1), reallocate(2), reallocate(4), reallocate(8) 8 konstante Zuweisungsoperationen Amortisierte Kosten für n Einfüge-Operationen: T (n) = da T reallocate (n) = O(n) log 2 n i=0 T reallocate (2 i ) + n = O(n), 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 1 5 6 2 11 4 13 8 9 Einfügen benötigt 3(n 1) Speicherzellen falls maximales n bekannt, ist ein bounded array oft besser 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 1 5 6 2 11 4 13 8 Warum schrumpft das Array nicht? die Zukunft nicht bekannt (Stichwort Online-Algorithmus) folgendes pushback erneutes O(n) Anwachsen Folge von n solcher popback / pushback hat Laufzeit O ( n 2) 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 1 5 6 2 11 4 13 8 Warum schrumpft das Array nicht? die Zukunft nicht bekannt (Stichwort Online-Algorithmus) folgendes pushback erneutes O(n) Anwachsen Folge von n solcher popback / pushback hat Laufzeit O ( n 2) deshalb erst bei 1/4 schrumpfen, dann waren Ω (n) konstante Operationen seit dem letzten Anwachsen/Schrumpfen 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 1 5 6 2 11 4 13 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 1 5 6 2 11 4 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 1 5 6 2 11 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 1 5 6 2 11 nach Einfüge- und Löschops bis zu 4(n 1) Speicherzellen benötigt hier hilft auch kein bounded array verkettete Listen haben genau n Elemente, aber zusätzliche Zeiger es gibt nicht eine perfekte Datenstruktur für alle Anwendungen 24 Timo Bingmann, Christian Schulz
Unbounded Array live! 1 1 5 1 5 6 2 1 5 6 2 11 4 13 8 1 5 6 2 11 1 5 6 2 bei einer Größe von 4n schrumpft das Feld auf 2n es bleibt Platz für weitere Elemente während dem Schrumpfen: 6n Speicherzellen gleichzeitig belegt außer Speicherverwaltung bietet Schrumpfoperation ohne Kopieren 24 Timo Bingmann, Christian Schulz
Unbounded Array: Allgemeine Version Kompromiss: im schlimmsten Fall weniger Platz, dafür langsamer? 25 Timo Bingmann, Christian Schulz
Unbounded Array: Allgemeine Version Kompromiss: im schlimmsten Fall weniger Platz, dafür langsamer? Ja! Durch Wahl des: Vergrößerungsfaktors β (hier bisher immer 2) Schranke α (hier bisher immer 4) der verallgemeinerten Version: 25 Timo Bingmann, Christian Schulz
Unbounded Array: Allgemeine Version Kompromiss: im schlimmsten Fall weniger Platz, dafür langsamer? Ja! Durch Wahl des: Vergrößerungsfaktors β (hier bisher immer 2) Schranke α (hier bisher immer 4) der verallgemeinerten Version: realloziere βn verkleinere bei αn w n > 0 25 Timo Bingmann, Christian Schulz
Unbounded Array: Parameter-Tuning realloziere βn verkleinere bei αn w n > 0 amortisierte Laufzeiten bleiben asymptotisch gleich für β > 1, α > β. größeres β, α: schneller, benötigt aber mehr Speicherplatz 26 Timo Bingmann, Christian Schulz
Unbounded Array: Parameter-Tuning realloziere βn verkleinere bei αn w n > 0 amortisierte Laufzeiten bleiben asymptotisch gleich für β > 1, α > β. größeres β, α: schneller, benötigt aber mehr Speicherplatz kleineres β, α: langsamer, benötigt aber weniger Speicherplatz 26 Timo Bingmann, Christian Schulz
Unbounded Array: Parameter-Tuning realloziere βn verkleinere bei αn w n > 0 amortisierte Laufzeiten bleiben asymptotisch gleich für β > 1, α > β. größeres β, α: schneller, benötigt aber mehr Speicherplatz kleineres β, α: langsamer, benötigt aber weniger Speicherplatz Formeln (asymptotisch, Beispielwerte für β = 1.5, α = 2): 26 Timo Bingmann, Christian Schulz
Unbounded Array: Parameter-Tuning realloziere βn verkleinere bei αn w n > 0 amortisierte Laufzeiten bleiben asymptotisch gleich für β > 1, α > β. größeres β, α: schneller, benötigt aber mehr Speicherplatz kleineres β, α: langsamer, benötigt aber weniger Speicherplatz Formeln (asymptotisch, Beispielwerte für β = 1.5, α = 2): amortisierte Kosten für pushback: β β 1 = 3 (bisher 2) 26 Timo Bingmann, Christian Schulz
Unbounded Array: Parameter-Tuning realloziere βn verkleinere bei αn w n > 0 amortisierte Laufzeiten bleiben asymptotisch gleich für β > 1, α > β. größeres β, α: schneller, benötigt aber mehr Speicherplatz kleineres β, α: langsamer, benötigt aber weniger Speicherplatz Formeln (asymptotisch, Beispielwerte für β = 1.5, α = 2): amortisierte Kosten für pushback: amortisierte Kosten für popback: β β 1 β α β = 3 (bisher 2) = 3 (bisher 1) 26 Timo Bingmann, Christian Schulz
Unbounded Array: Parameter-Tuning realloziere βn verkleinere bei αn w n > 0 amortisierte Laufzeiten bleiben asymptotisch gleich für β > 1, α > β. größeres β, α: schneller, benötigt aber mehr Speicherplatz kleineres β, α: langsamer, benötigt aber weniger Speicherplatz Formeln (asymptotisch, Beispielwerte für β = 1.5, α = 2): amortisierte Kosten für pushback: β β 1 β α β = 3 (bisher 2) amortisierte Kosten für popback: = 3 (bisher 1) maximaler Speicherplatzbedarf: (α + β)n = 3.5n (bisher 6n) mindestens > 2n 26 Timo Bingmann, Christian Schulz
Hashtabellen: Beispielanwendung: Duplikaterkennung 27 Timo Bingmann, Christian Schulz
Duplikaterkennung Problem: Gegeben: Folge A := a 1, a 2,..., a n von Zahlen Frage: Enthält A ein oder mehrere Duplikate a i = a j, i j? 28 Timo Bingmann, Christian Schulz
Duplikaterkennung Problem: Gegeben: Folge A := a 1, a 2,..., a n von Zahlen Frage: Enthält A ein oder mehrere Duplikate a i = a j, i j? Ansatz 1: Löse Problem mit Sortieren Idee: Sortiere A A := a 1,..., a n. In A stehen Duplikate nebeneinander A von links nach rechts durchlesen liefert alle Duplikate Worst-Case Laufzeit: Ω(n log n) (siehe Vorlesung Sortieren & Co ) 28 Timo Bingmann, Christian Schulz
Duplikaterkennung Problem: Gegeben: Folge A := a 1, a 2,..., a n von Zahlen Frage: Enthält A ein oder mehrere Duplikate a i = a j, i j? Ansatz 2: Verwende eine Hashtabelle H (mit verketteten Listen) Idee: Füge a 1,..., a n nacheinander in H ein Zahl schon drin: Duplikat erkannt! Laufzeit: Erwartet O(n) Bei zufälliger Hashfunktion und wenn H mindestens Ω(n) Slots hat 28 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Beispiel Folge A := 9, 18, 42, 25, 33, 18, 104, Hashfunktion h(a) = a mod 7 0 1 2 3 4 5 6 29 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Beispiel Folge A := 9, 18, 42, 25, 33, 18, 104, Hashfunktion h(a) = a mod 7 0 1 2 3 4 5 6 9 29 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Beispiel Folge A := 9, 18, 42, 25, 33, 18, 104, Hashfunktion h(a) = a mod 7 0 1 2 3 4 5 6 9 18 29 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Beispiel Folge A := 9, 18, 42, 25, 33, 18, 104, Hashfunktion h(a) = a mod 7 0 1 2 3 4 5 6 42 9 18 29 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Beispiel Folge A := 9, 18, 42, 25, 33, 18, 104, Hashfunktion h(a) = a mod 7 0 1 2 3 4 5 6 42 9 25 18 29 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Beispiel Folge A := 9, 18, 42, 25, 33, 18, 104, Hashfunktion h(a) = a mod 7 0 1 2 3 4 5 6 42 9 25 33 18 29 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Beispiel Folge A := 9, 18, 42, 25, 33, 18, 104, Hashfunktion h(a) = a mod 7 0 1 2 3 4 5 6 42 9 25 33 18 29 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Beispiel Folge A := 9, 18, 42, 25, 33, 18, 104, Hashfunktion h(a) = a mod 7 0 1 2 3 4 5 6 42 9 25 33 18 Schon enthalten! 29 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Pseudocode 1: function hasduplicates(a : Sequence of N 0 ) : {true, false} 2: H := new HashTableWithChaining of N 0 with A slots 3: for all a A do 4: if H.find(a) NIL then return true 5: H.insert(a) 6: end do 7: return false 30 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Laufzeitanalyse Zwei Schritte 1 Erzeugen der Hashtabelle 2 Finden und Einfügen aller a i aus A = a 1,..., a n 31 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Laufzeitanalyse Zwei Schritte 1 Erzeugen der Hashtabelle Alle Slots mit Null-Zeiger initialisieren Zeit: O( A ), da Tabelle A Slots hat 2 Finden und Einfügen aller a i aus A = a 1,..., a n 31 Timo Bingmann, Christian Schulz
Erkennen von Duplikaten mittels Hashtabelle Laufzeitanalyse Zwei Schritte 1 Erzeugen der Hashtabelle Alle Slots mit Null-Zeiger initialisieren Zeit: O( A ), da Tabelle A Slots hat 2 Finden und Einfügen aller a i aus A = a 1,..., a n Zeit pro Einfügen: O(1) Zeit pro H.find(a): O(Listenlänge) Aber: Erwartete Laufzeit O(1) Denn: Tabelle hat A Slots Hierzu Satz aus Vorlesung: erwartete Listenlänge O(1) Gesamtzeit für Finden und Einfügen: erwartet O( A ) 31 Timo Bingmann, Christian Schulz
Hashtabellen in heutigen Programmiersprachen Java: bool hasduplicates(integer[] A) { HashMap<Integer,Integer> H = new HashMap<Integer,Integer>(2 * A.length()); for (int i = 0; i < A.length(); i++) { if ( H.get(A[i])!= null ) return true; H.put(A[i]); } return false; } 32 Timo Bingmann, Christian Schulz
Das Paging Problem Aufgabe: Nur begrenzt viele Speicherstellen s i (Blöcke, Cache, etc). {s i } = S {x i } = X Elemente x i müssen zur Verarbeitung in einer Speicherstelle s j geladen sein. Hierzu gibt es eine Operation Retrieve(x i ) s j und eine Write(s j, x i ), die hier nicht interessiert. 33 Timo Bingmann, Christian Schulz
Das LRU-Paging Problem Bei Retrieve(x i ) s j wird geprüft, ob x i bereits geladen ist, wenn ja wird die bestehende Speicherstellen zurückgeliefert, sonst wir eine Speicherstelle s j ausgewählt, zurück geschrieben, und mit x i geladen. Anforderung: im zweiten Fall, soll immer die älteste Speicherstelle zurückgeschrieben werden. Es sollen also immer die Ergebnisse der letzten S Retrieve(x i ) Aufrufe geladen sein, inklusive der Treffer aus dem ersten Fall. (least-recently-used (LRU) Page Replacement) 34 Timo Bingmann, Christian Schulz
Das LRU-Paging Problem Bei Retrieve(x i ) s j wird geprüft, ob x i bereits geladen ist, wenn ja wird die bestehende Speicherstellen zurückgeliefert, sonst wir eine Speicherstelle s j ausgewählt, zurück geschrieben, und mit x i geladen. Anforderung: im zweiten Fall, soll immer die älteste Speicherstelle zurückgeschrieben werden. Es sollen also immer die Ergebnisse der letzten S Retrieve(x i ) Aufrufe geladen sein, inklusive der Treffer aus dem ersten Fall. (least-recently-used (LRU) Page Replacement) Naive Methode: Die Speicherstellen mit Zeitstempel versehen. Alle zurückgelieferte Stellen werden gestempelt. Bei Retrieve(x i ) die Menge S einmal nach x i scannen und dabei die älteste Speicherstelle merken. 34 Timo Bingmann, Christian Schulz
Ein Erwartet O(1) Pager Hashtabelle nil nil nil nil nil nil x 4 1 x 8 2 x 6 3 x 2 4 nil nil x 1 6 x 9 5 nil Nach Retrieve(x i ) Folge x 4, x 8, x 6, x 2, x 9, x 1 nil 35 Timo Bingmann, Christian Schulz
next prev Ein Erwartet O(1) Pager Hashtabelle sentinel next prev x 4 1 nil next prev x 8 2 nil x 6 3 nil nil next prev x 2 4 nil nil nil prev next nil x 1 6 prev next x 9 5 nil Nach Retrieve(x i ) Folge x 4, x 8, x 6, x 2, x 9, x 1 nil 35 Timo Bingmann, Christian Schulz
next prev Ein Erwartet O(1) Pager Hashtabelle sentinel next prev x 4 1 nil next prev x 8 2 nil x 6 3 nil nil next prev x 2 4 nil nil nil prev next nil x 1 6 prev next x 9 5 nil Nach Retrieve(x i ) Folge x 4, x 8, x 6, x 2, x 9, x 1 Sentinel s next zeigt immer auf die älteste Speicherstelle, und prev auf die jüngste. nil 35 Timo Bingmann, Christian Schulz
next prev Ein Erwartet O(1) Pager Hashtabelle sentinel next prev x 4 1 nil next prev nil x 6 3 nil nil next prev x 2 4 nil nil nil prev next x 8 7 prev next x 1 6 prev next x 9 5 nil nil nil Nach Retrieve(x i ) Folge x 4, x 8, x 6, x 2, x 9, x 1, x 8 36 Timo Bingmann, Christian Schulz
next prev Ein Erwartet O(1) Pager Hashtabelle sentinel nil next prev nil x 6 3 nil nil next prev x 2 4 nil nil prev next x 3 8 x 8 7 prev next x 1 6 prev next x 9 5 nil nil nil nil Nach Retrieve(x i ) Folge x 4, x 8, x 6, x 2, x 9, x 1, x 8, x 3 37 Timo Bingmann, Christian Schulz