Sanders / van Stee: Algorithmentechnik October 30, 2007 2 Folgen als Felder und Listen 1 Sanders / van Stee: Algorithmentechnik October 30, 2007 Beschränkte Felder (Bounded Arrays) Eingebaute Datenstruktur. Größe muss von Anfang an bekannt sein 2 Sanders / van Stee: Algorithmentechnik October 30, 2007 Unbeschränke Felder z.B. std::vector pushBack: Element anhängen popBack: Letztes Element löschen Idee: verdopple wenn der Platz ausgeht. Hhalbiere wenn Platz verschwendet wird Wenn man das richtig macht, brauchen n pushBack/popBack Operationen Zeit O(n) Algorithmese: pushBack/popBack haben konstante amortisierte Komplexität 3 Sanders / van Stee: Algorithmentechnik October 30, 2007 Class UArray of Element w =1 : N n=0 : N invariant n ≤ w < α n or n = 0 and w ≤ 2 b : Array [0..w − 1] of Element w n ··· // b → e0 · · · en−1 Operator [i : N] : Element assert 0 ≤ i < n return b[i] Function size : N return n 4 // allocated size // current size. Sanders / van Stee: Algorithmentechnik October 30, 2007 Procedure pushBack(e : Element) if n = w then reallocate(2n) b[n]:= e n++ Procedure reallocate(w′ : N) w:= w′ 5 // Example for n = w = 4: // b → 0 1 2 3 // b → 0 1 2 3 // b → 0 1 2 3 e // b → 0 1 2 3 e // Example for w = 4, w′ = 8: // b → 0 1 2 3 b′ := allocate Array [0..w′ − 1] of Element// b′ → (b′ [0], . . . , b′ [n − 1]):= (b[0], . . . , b[n − 1])// b′ → 0 1 2 3 dispose b b:= b′ // b → 0 1 2 3 // pointer assignment b → 0 1 2 3 Sanders / van Stee: Algorithmentechnik October 30, 2007 Kürzen Procedure popBack // Example for n = 5, w = 16: assert n > 0 // b → 0 1 2 3 4 n−− // b → 0 1 2 3 4 if 4n ≤ w ∧ n > 0 then // reduce waste of space // b → 0 1 2 3 reallocate(2n) 6 Sanders / van Stee: Algorithmentechnik October 30, 2007 Amortisierte Komplexität unbeschr. Felder Sei u ein anfangs leeres, unbeschränktes Feld. Jede Operationenfolge σ = hσ1 , . . . , σm i von pushBack oder popBack Operationen auf u wird in Zeit O(m) ausgeführt. Sprechweise: pushBack und popBack haben amortisiert konstante Ausführungszeit — #Ops z}|{ O m / |{z} m = O(1) . Gesamtzeit 7 Sanders / van Stee: Algorithmentechnik October 30, 2007 Beweis: Konto-Methode (oder Versicherung) Operation Kosten pushBack ◦◦ (2 Token) einzahlen popBack ◦ (1 Token) einzahlen n×◦ (n Token) abheben reallocate(2n) Typ Zu zeigen: keine Überziehungen Erster Aufruf von reallocate: kein Problem 8 Sanders / van Stee: Algorithmentechnik October 30, 2007 Beweis: Konto-Methode (oder Versicherung) Operation Kosten pushBack ◦◦ (2 Token) einzahlen popBack ◦ (1 Token) einzahlen n×◦ (n Token) abheben reallocate(2n) Typ Weitere Aufrufe von reallocate: ≥n×pushBack rauf: reallocate(2n) | {z ≥n×◦◦ } reallocate(4n) ≥n/2×popBack runter: reallocate(2n) | {z ≥n/2×◦ } reallocate(n) 9 Sanders / van Stee: Algorithmentechnik October 30, 2007 Doppelt verkettete Listen 10 Sanders / van Stee: Algorithmentechnik October 30, 2007 11 Class Item of Element // one link in a doubly linked list e : Element next : Handle // prev : Handle invariant next→prev=prev→next=this Trick: dummy header ⊥ - - ··· ··· - Sanders / van Stee: Algorithmentechnik October 30, 2007 Procedure splice(a,b,t : Handle) assert b is not before a ∧ t 6∈ ha, . . . , bi ′ a a // Cut out ha, . . . , bi a′ := a→prev b′ := b→next a′ →next := b′ // b′ →prev := a′ // Y t // insert ha, . . . , bi after t t ′ := t→next // 12 b′ b - ··· ··· - - ··· ··· R - - a t′ b R - Y - ··· ··· R - - - b→next := t’ a→prev := t // // Y - ··· ··· t →next := a t ′ →prev := b // // - ··· ··· Sanders / van Stee: Algorithmentechnik October 30, 2007 Einfach verkettete Listen ... Vergleich mit doppelt verketteten Listen Weniger Speicherplatz Platz ist oft auch Zeit Eingeschränkter, z.B. kein delete Merkwürdige Benutzerschnittstelle, z.B. deleteAfter 13 Sanders / van Stee: Algorithmentechnik October 30, 2007 14 Speicherverwaltung für Listen kann leicht 90 % der Zeit kosten! Lieber Elemente zwischen (Free)lists herschieben als echte mallocs Alloziere viele Items gleichzeitig Am Ende alles freigeben? Speichere „parasitär“. z.B. Graphen: Knotenarray. Jeder Knoten speichert ein ListItem Partition der Knoten kann als verkettete Listen gespeichert werden MST, shortest Path Challenge: garbage collection, viele Datentypen auch ein Software Engineering Problem hier nicht Sanders / van Stee: Algorithmentechnik October 30, 2007 Class BoundedFIFO(n : N) of Element b : Array [0..n] of Element h=0 : N t=0 : N Function isEmpty : {0, 1}; return h = t 15 n0 h b Function first : Element; assert ¬isEmpty; return b[h] Function size : N; return (t − h + n + 1) mod (n + 1) Procedure pushBack(x : Element) assert size< n b[t] := x t := (t + 1) mod (n + 1) Procedure popFront assert ¬isEmpty; h := (h + 1) mod (n + 1) t Sanders / van Stee: Algorithmentechnik October 30, 2007 Operation List SList UArray CArray [·] |·| n 1∗ 1 1 1 1 1 1 1 1 1 1 n n 1∗ 1 1 1∗ 1∗ 1 1 n 1 1 1 n 1 1 1 1 n n 1∗ n 1∗ n n n n∗ 1 1 1 1 n n 1∗ 1∗ 1∗ 1∗ n n n∗ first last insert remove pushBack pushFront popBack popFront concat splice findNext,. . . 16 explanation ‘∗ ’ not with inter-list splice insertAfter only removeAfter only amortized amortized amortized amortized cache-efficient Sanders / van Stee: Algorithmentechnik October 30, 2007 17 Externe Stapel Datei mit Blöcken 2 interne Puffer push: Falls Platz, in Puffer. Sonst schreibe Puffer zwei in die Datei (push auf Blockebene) pop: Falls vorhanden, pop aus Puffer. Sonst lese Puffer eins aus der Datei (pop auf Blockebene) Analyse: amortisiert O(1/B) I/Os pro Operation Aufgabe 1: Beweis. Aufgabe 2: effiziente Implementierung ohne überflüssiges Kopieren