Algorithmen Vorlesung im Grundstudium Informatik Rolf Niedermeier Michael Kaufmann Wilhelm-Schickard-Institut für Informatik Universität Tübingen Sand 13, 72076 Tübingen {niedermr, mk}@informatik.uni-tuebingen.de Sommersemester 2000/01 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 1 1. Suchen Dictionaries - Mengenverwaltung Grundsätzlich 2 Fälle: • Zu verwaltende Datenmenge ist kleiner Teil des Universums; • Menge praktisch das gesamte Universum. Elemente bestehen aus Schlüssel und Information. Auf Universum U sei lineare Ordnung (U, <) definiert. Sei S ⊆ U die zu verwaltende Menge von Schlüsseln. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 2 1 Operationen: Zugriff (a,S ) Einfüge (a,S ) if a ∈ S then output (Info unter Schlüssel a ) else output ( a ∉ S ) S ← S ∪ {a} Streiche ( a,S ) Ord (k,S ) S ← S\{a} output ← k-t größtes Element von S Sort ( S ) output ← S , geordnet Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 3 Beispiel für Suchen: Telefonbuch-CD lineare Suche U = S , S als Array Eingabe (a ∈ U ); while not gefunden i ← i + 1; gefunden ← (a = S [i ]) endwhile Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 4 2 Laufzeit: T (n, best) = 2 T (n, worst) = 2 + 2n T (n, average) = 2 + n Gemessene Laufzeit: Geschätzte Laufzeit: So sucht man nicht in Telefonbüchern! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 5 1.1 Binäre Suche Voraussetzung: S geordnet! Laufzeit: T (n, best ) = 4 n T (n, worst ) = 4 + T , worst 2 = 4 ⋅ log 2 n Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 6 3 Eingabe ( a ∈ U ) unten ← 0, oben ← n while unten < oben and (nicht gefunden) unten + oben do if a < S 2 unten + oben then if oben > 1 then oben ← 2 else unten ← oben fi else unten + oben if a > S 2 unten + then unten ← 2 oben + unten oben else Ausgabe ist gesuchter Index 2 fi od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 7 1.2 Interpolationssuche Variante von binärer Suche vorher: next ← (oben + unten )/2 jetzt: a − S [unten ] (oben − unten ) + unten next ← S [oben ] − S[unten ] Schlechtester Fall: O(n) Im Mittel: O(log log n ) bei Annahme S zufällige Teilmenge von [0,1] Originalanalyse kompliziert. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 8 4 Zur Suche von a im Feld S „interpoliere“ a durch S [next ] und bestimme Teilfeld von S der Größe n ; im Teilfeld ggf. rekursiv nach a suchen. Dabei zur einfacheren Analyse folgende Variante für Wert von next benutzen: a − S [unten − 1] (oben − unten + 1) next ← unten − 1 + S [oben + 1] − S [unten − 1] n ← oben − unten + 1 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 9 Interpolation von a durch S [next ] Fall 1: „=“ fertig lineare Suche : Vgl. a mit S [next + n ] , Fall 2: „>“ S [next + 2 n ] , ... bis a < S [next + (i - 1) n ]. Bem.: a) Das kostet uns i Vergleiche [ b) Nun gilt S next + (i − 2) n ] ≤ a < S [ next + (i − 1) n ] Fall 3: „<“ analog Nun rekursive Anwendung auf Teilmenge der Größe Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen n. 10 5 Sei C mittlere Anzahl der Vergleiche, um Teilproblem der Größe n zu finden. Dabei Wahrscheinlichkeitsannahme: x1 ,..., x n und a sind zufällige Elemente des Intervalls ( x0 , x n +1 ) gezogen gemäß Gleichverteilung; sind voneinander unabhängig. Sei pi Wahrscheinlichkeit, dass ≥ i Vergleiche benötigt werden. Dann ist C = ∑ (i − 1)( pi − pi ) = ∑ pi . i ≥1 Vorlesung Algorithmen (RN/MK) i ≥1 WSI für Informatik, Universität Tübingen 11 Berechnung der pi ’s : p1 = p 2 = 1 (Da stets ≥ 2 Vergleiche) Sei nun i ≥ 3 Falls i Vergleiche nötig sind, weicht tatsächlicher Rang von a in der Folge x1 ,..., x n (d.h. die Anzahl der x j ≤ a ) um mindestens (i − 2) n von next ab, d.h. ( pi ≤ prob (Rang von a in x 1 ,..., x n ) − next ≥ (i − 2 ) n ) hat die Form ( ) prob Y - µ(Y ) ≥ (i − 2) n . Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 12 6 Y ist Zufallsvariable, die den Rang von a in x1,...,xn angibt und (Y ) ihr Mittelwert. Wir benutzen Tschebyscheff’sche Ungleichung prob( Y − > t) ≤ 2 t2 Mittelwert 2 Varianz Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 13 1. Mittelwert: Wahrscheinlichkeit, dass genau j Elemente < a sind, ist n j p (1 − p )n − j und damit j n n n− j = ∑ j p j (1 − p ) j =1 j n n − 1 j −1 p (1 − p )n − j = n ⋅ p ∑ − i 1 j =1 = n⋅ p Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 14 7 2. Varianz: 2 = ∑( j − )2 n j n− j p (1 − p ) = p(1 − p ) ⋅ n j Einsetzen in Tschebyscheff ergibt: ( p i ≤ prob Rang von x - next ≥ (i − 2 ) n ≤ ≤ ) 2 t2 p (1 - p )n 1 ≤ n 4(i − 2 ) und damit gilt (i − 2) 2 2 C = ∑ pi ≤ 2 + ∑ i ≥1 i ≥3 1 4(i − 2 ) Vorlesung Algorithmen (RN/MK) 2 ≤ 2+ 2 24 ≈ 2. 4 WSI für Informatik, Universität Tübingen 15 Sei nun T (n ) die mittlere Anzahl von Vergleichen, die notwendig sind, um a mit quadratischer Binärsuche in Menge der Größe n zu finden, dann gilt: T (1) = 1 , T (2) ≤ 2 T (n ) ≤ C + T ( n) n>2 und damit T (n ) ≤ 2 + C log log n Satz: Quadratische Binärsuche braucht im Mittel ≤ 2 + 2.4 log log n Vergleiche. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 16 8 Bemerkungen: • Vorsicht: Annahme der Gleichverteilung ist kritisch. • Laufzeit im schlechtesten Fall n+ ( ) n+ n + ... = O n • exponentielle + binäre Suche erlaubt Bestimmung von i mit O(log i) Vergleichen. Schlechtester Fall: log n + log 1 1 1 n + ... = log n + + + ... = log n 2 4 8 also noch besser. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 17 2. Sortieren Beispiel für Analyse von Verfahren und gleichzeitig „eine Art, Datenmengen zu verwalten“. Sortieren: eine Folge so permutieren, dass sie aufsteigend geordnet ist. 13,7,11 7,11,13 Motivation: 25% aller Rechnerzeit wird für Sortieren verbraucht. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 18 9 2.1 Sortieren durch Auswahl: Eingabe: 11,3,6,7,6,12 Ausgabe: 3,6,6,7,11,12 Jeweils Minimum suchen, Ausgeben, Streichen 1.) Wie repräsentieren wir Ein- und Ausgabefolgen? 2.) Was bedeutet es, eine Zahl zu streichen? 3.) Wie bestimmen wir Minimum? Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 19 Ad 1.) Benutzen z.B. Felder A und B: i-tes Ein- und Ausgabeelement in A[i] bzw. B[i]. Ad 2.) Benutzen weiteres Feld: Rem: array [1...n] of boolean Rem[i] = true bedeutet, dass A[i] durchgestrichen ist. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 20 10 Ad 3.) function Posofmin: integer; var i,pos : integer begin i := 1; while Rem[i] do i := i+1; pos := i; for i = 1 to n do if (A[i] < A[pos]) and not Rem[i] then pos := i; Posofmin := pos; end Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 21 Wenn wir nicht Zahlen sortieren, sondern beliebige Elemente eines bestimmten Typs, so ersetzen wir (A[i] < A[pos]) durch lessthan (A[i], A[pos]), wobei function lessthan (x,y : typ): boolean geeignet definiert werden muß. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 22 11 Sortieren durch Auswahl for i := 1 to n do Rem[i] := false; for i := 1 to n do begin j := posmin; B[i] := A[j]; Rem[j] := true end; Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 23 Elegantere und platzeffizientere Lösung 86376 3|6 8 7 6 3 6|8 7 6 3 6 6|7 8 3 6 6 7|8 36678 for i := 1 to n do begin j := posmin (i,n); (* posmin liefert das Minimum von A[i],...,A[n] *) interchange (A[i], A[j]); end; Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 24 12 2.2 Quicksort (Sortieren durch Teilen) Wende „Teile- und Beherrsche“-Prinzip an. Eingabe: Feld S mit Werten x1, x2, ..., xn Idee 1. Teile S-{x1} bzgl. x1 in 2 Mengen A,B (Teile) A = {xi | i ≥ 2 und xi ≤ x1 }, sei A = j B = {xi | i ≥ 2 und xi > x1 } Speichere A in S[1]...S[j] x1 in S[j+1] B in S[j+2]...S[n] x1 A j j+1 B 2. Wende Verfahren rekursiv auf A und B an. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen (Beherrsche) 25 Implementierung: Füge S [0] = −∞ und S [n + 1] = +∞ zu S hinzu. Dies erspart einige Tests. Teil 1: Teile i := 2 ; j := n ; k := S[1] ; repeat while S [i ] ≤ k do i := i+1 ; while S [ j ] > k do j := j-1 ; if i ≤ j then vertausche (S[i], S[j]) i := i+1 ; j := j-1 ; fi until i > j ; Vertausche (S[1], S[j]) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 26 13 Analyse: Kosten = Anzahl der Vergleiche zwischen S[i]‘s. Kosten im schlechtesten Fall: Kosten eines Aufrufs Quicksort (l,r) sind a) unmittelbare Kosten bei Teile-Schritt O(r-l+1) Vergleiche b) Kosten der rekursiven Aufrufe Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 27 Sei QS(n) = max. Anzahl von Vergleichen, die Quicksort an Feld der Länge n durchführt. Es gilt: QS (n ) = n + max{ QS ( j − 1) + QS (n − j )} 424 3 1424 3 1≤ j ≤ n 1 rek. Aufruf für A QS (0 ) = QS (1) = 0. Vorlesung Algorithmen (RN/MK) für B WSI für Informatik, Universität Tübingen 28 14 Behauptung: n QS (n ) = ∑ i ≤ i =2 ( ) 1 n(n + 1) = O n 2 2 Beweis: durch Induktion Bemerkung: An Eingabe 1, 2, 3, ..., n führt Quicksort wirklich O(n2) Vergleiche durch. Obere Schranke ist also scharf. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 29 Kosten im Mittel: Annahmen: 1. Elemente von S sind paarweise verschieden. 2. Jede der n! möglichen Permutationen der Eingabe ist gleich wahrscheinlich. Damit können wir o.B.d.A. annehmen, dass die Schlüssel die Zahlen 1, 2, ..., n sind und dass S[1] = k ist mit Wahrscheinlichkeit 1/n für 1 ≤ k ≤ n. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 30 15 Dann müssen rekursiv Teilprobleme der Größe k-1 und n-k gelöst werden. Diese Teilprobleme sind wieder zufällige Folgen, d.h. sie erfüllen Annahmen 1.) und 2.). (Beweis: entfällt, siehe Literatur) Sei QS (n ) die mittlere Anzahl der Vergleiche, die Quicksort an einem Feld der Größe n durchführt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen QS (0 ) = QS (1) = 0 ( 31 ) und QS (n ) = n + " Erwartungswert QS ( A) + QS (B ) " = n+ ( ) 1 n ∑ QS (k − 1) + QS (n − k ) n k =1 2 n −1 = n + ∑ QS (k ) n k =0 n −1 n ⋅ QS (n ) = n 2 + 2∑ QS (k ) k =0 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 32 16 und n (n + 1)QS (n + 1) = (n + 1)2 + 2∑ QS (k ) k =0 Dann: (n + 1)QS (n + 1) − nQS (n ) = (n + 1)2 − n 2 + 2QS (n ) = 2n + 1 + 2QS (n ) (n + 1)QS (n + 1) = 2n + 1 + (n + 2)QS (n ) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 33 ⇒ n+2 QS (n ) n +1 n+2 n +1 n (2 + ...) 2 + = 2+ 2 + n +1 n n −1 QS (n + 1) ≤ 2 + 2 2 2 = 2 + n + 2 + + + K + 1 n +1 n n −1 1 1 1 = 21 + n + 2 + + K + . n n + 1 2 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 34 17 d.h. n 1 n 1 QS (n ) ≤ 21 + (n + 1)∑ = 2 + 2(n + 1) ∑ − 1 i=2 i i =1 i n 1 = 2 + 2(n + 1)∑ − 2(n + 1) i =1 i n 1 = 2(n + 1)∑ − 2n i =1 i ≤ 2(n + 1)(1 + ln n ) − 2n = O(n log n ) Satz: Die mittlere Laufzeit von Quicksort ist O(n log n). Vorlesung Algorithmen (RN/MK) 2.3 Heapsort WSI für Informatik, Universität Tübingen 35 (ein Sortieren durch Auswahl) Heap ist Datenstruktur, die folgende Operationen unterstützt: • function Emptyheap : heap; liefert Heap mit Wert ø. • procedure Insert (x: item, var h: heap); verändert „Wert“ von h durch Einfügen von x • function Extractmin (var h: heap): item; verändert Wert von h durch Streichen des Minimums und liefert gestrichenes Element. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 36 18 Heapsort: h := Emptyheap; for i = 1 to n do Insert (A[i], h); for i = 1 to n do B[i] := Extractmin (h); Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 37 Zur Realisierung von Heaps: Ein binärer Baum ist entweder leer oder er besteht aus einem Knoten, der Wurzel genannt wird, und einem rechten und linken Teilbaum. Bsp.: u v w x u ist die Wurzel, v die Wurzel des linken Teilbaums von u, ... v = Kind von u, u = Elternknoten von v, x ist ein Blatt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 38 19 Sei u ein Knoten in einem Baum T. 0, falls u die Wurzel ist Tiefe(u) := Tiefe(Elternknoten(u)) +1, sonst Bsp.: Tiefe(w) = 1 0, falls u ein Blatt ist Höhe(u) := max{Höhe(v) | v ist Kind von u} +1, sonst Bsp.: Höhe(w) = 2 Tiefe(T) := max {Tiefe(u) | u ist Knoten in T} Höhe(T) := max {Höhe(u) | u ist Knoten in T} = Höhe(Wurzel(T)) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 39 (Binäre) Heaps lassen sich durch Binärbäume darstellen: Bsp.: {1, 2, 3, 4, 5} darstellbar durch 1 5 1 2 4 2 oder 3 oder ... 3 4 5 Jeder Baumknoten u ist mit einem Element S[u] beschriftet. Zusätzlich fordern wir die „Heap-Eigenschaft“: Ist u Elternknoten von v, so ist S [u ] ≤ S [v ] Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 40 20 Realisierung der Heap-Operationen: • function Emptyheap: klar! • function Extractmin: Minimumsbestimmung: Min. steht an der Wurzel Minimumsentfernung: Baum muss „reorganisiert“ werden Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 41 Bsp.: 2 6 8 10 ⇒ 4 11 10 Reorg. I 6 15 6 8 4 11 6 15 13 13 I) Beliebiges Blatt wird entfernt und an die Wurzel gesetzt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 42 21 II) danach wird durch sukzessives Vertauschen mit dem kleinsten Kind die Heap-Eigenschaft wiederhergestellt: 4 Reorg. II ⇒ 6 8 4 Reorg. II ⇒ 10 11 6 6 8 15 6 11 10 13 13 Vorlesung Algorithmen (RN/MK) 15 WSI für Informatik, Universität Tübingen 43 procedure Insert: Einzufügendes Element an Knoten anhängen, welcher höchstens ein Kind hat. Danach Vertauschen mit Elternknoten, falls dieser größer ist usw. Bsp.: Einfügen des Elements 5: ⇒ 4 6 8 6 11 10 5 ⇒ 4 6 15 13 Vorlesung Algorithmen (RN/MK) 8 6 11 5 10 4 6 15 13 8 11 6 5 10 WSI für Informatik, Universität Tübingen 15 13 44 22 Ausgewogene Bäume: Es gibt k ≥ 0, sodass 1. Alle Blätter haben Tiefe k oder k+1 und 2. Blätter der Tiefe k+1 sitzen „ganz links“. Bsp.: 1 2 4 8 3 5 6 7 Nummerierung der Knoten: Nummeriere Knoten der Höhe nach und innerhalb jeder Höhe von links nach rechts. 9 10 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 45 Dann gilt: (1) Hat ein Knoten Nummer i > 1, so hat sein Elternknoten die Nummer i / 2 . (2) Hat ein Knoten Nummer i, so haben seine Kinder (falls existent) die Nummern 2i und 2i+1. ⇒ Darstellung ausgewogener binärer Baum durch Paar (A,n), wobei n Anzahl der Knoten und A Array, sodass A[i] Beschriftung des Knotens mit Nummer i ist für alle i = 1, ..., n. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 46 23 Beispiel: 1 16 2 14 3 4 5 8 7 8 2 4 9 1 9 10 6 3 7 10 A: 16 14 10 8 7 9 3 2 4 1 1 2 3 4 5 6 7 8 9 10 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 47 Zur Implementierung von Heapsort: type heap = record A: array [1...N] of item; <*N hinreichend groß*> n: integer; end function Emptyheap : heap; var h: heap; begin h.n := 0; <*keine Elemente*> Emptyheap := h end Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 48 24 procedure Insert (x: item; var h: heap); var i,j: integer; finish: boolean; begin h.n := h.n +1; <*ein Element mehr*> i := h.n h.A[i] := x; <*neues, „linksbündiges“ El.*> finish := (i = 1); while not finish do begin j := i div 2 <*j Elternknoten von i*> if h.A[i] < h.A[j] then Interchange (h.A[i], h.A[j]) else finish := true; i := j; if finish = false then finish := (i=1); end end Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 49 Zur Laufzeit-Analyse von Heapsort: Heapsort besteht i.w. aus je n Aufrufen von Insert und Extractmin. „Leicht“ sieht man: Ausführungszeit von Insert und Extractmin ist O(Höhe des Baumes) Lemma: Hat ein ausgewogener Baum die Höhe m, so enthält er mindestens 2m und weniger als 2m+1 Knoten. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 50 25 Nun gilt: 2 m ≤ n ⇒ m − 1 ≤ log n Wir erhalten Laufzeit = O(n ⋅ m ) = O(n ⋅ (log n + 1)) = O(n log n ). Bemerkungen: • Obwohl Heapsort im Gegensatz zu Quicksort sogar im Worst Case Laufzeit O(n log n) hat, ist Quicksort in der Praxis meist überlegen. • Für „vergleichsbasierte Sortierverfahren“ läßt sich die untere Schranke Ω(n log n ) beweisen, Heapsort ist in diesem Sinne also asymptotisch optimal. Diese untere Schranke gilt auch im Durchschnitt (bei Gleichverteilung). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 2.4 Mergesort 51 (Sortieren durch Mischen) Bisher betrachtete Sortierverfahren: Daten im Hauptspeicher. Für externe Speichermedien, aber andere Sortierverfahren vorteilhaft, z.B. Sortieren durch Mischen: Füge zwei (oder mehrere) sortierte Folgen zu einer sortierten Folge zusammen. Z.B. 11 6 6 5 3 12 8 5 Vorlesung Algorithmen (RN/MK) 12 11 8 6 6 WSI für Informatik, Universität Tübingen 5 5 3 52 26 Mischalgorithmus: Start mit leerer Ausgabefolge Solange mind. eine Eingabefolge nichtleer, - bestimme x = min A, wobei A die Menge der ersten Elemente der nichtleeren Eingabefolgen ist, - entferne x aus Eingabefolge, wo es vorkommt und - füge es ans Ende der Ausgabefolge. Korrektheit: x ist nicht nur das Minimum über A, sondern über der Menge aller verbleibenden Eingabeelemente ... Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 53 Zum Sortierverfahren: Bezeichne aufsteigend sortierte Teilfolgen als „Runs“. Grundprinzip: Teile Eingabe in Teilfolgen der Länge 1 (das sind Runs). Mische danach Runs zu längeren Runs. Bsp.: Eingabe: 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 (1) Streuphase: 3, 4, 5, 2, 5, 5 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 1, 1, 9, 6, 3 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 54 27 (2) Mischphase: 345255 13 59 35 11963 14 26 5 1134 355 11234569 2569 355 11233455569 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 55 Beobachtung: Nach i-tem Durchlauf haben alle Runs Länge ≤ 2i . Allgemeiner: pi für p = # Eingabedateien = # Ausgabedateien Wenn p i ≥ n, so ist die Eingabe sortiert. Also genau log p n Durchläufe nötig. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 56 28 Effizienzverbesserung: Annahme: Hauptspeicher habe Platz für m Elemente (p < m < n). Dann können wir Durchläufe sparen, indem wir interne Sortierverfahren dazu benutzen, anfangs Runs der Länge m zu erstellen. Bsp.: m = 3 134 256 3 1 4 1 5 9 2 6 5 3 5 159 35 113 459 11233455569 235 56 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 57 Analyse: Nach i Durchläufen haben die Runs Länge m·2i (bzw. m· pi). n Also genügen log p Durchläufe. m Bsp.: n = 107, m = 104, p = 3 ⇒ 7 Durchläufe Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 58 29 2.5 Bucketsort (Sortieren durch Fachverteilung) Betrachte oBdA Alphabet Σ = {1, 2, ..., m} Für die Wörter x = x1 ... xk und y = y1 ... yr ∈ Σ* sagen wir, dass x kleiner als y (x < y) ist, genau dann, wenn ∃i, 0 ≤ i ≤ k ∀j, 1 ≤ j ≤ i: x j = y j und entweder i = k < r oder i < k und i < r und xi+1 < yi+1. Ziel: Wörter über dem Alphabet Σ bzgl. der gegebenen Ordnung sortieren. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 59 Spezialfall 1: Alle n Wörter haben Länge 1. Lösungsansatz: Stelle m Fächer bereit und gehe die n Zahlen durch und wirf jede Zahl in das ihrem Wert gemäße Fach. Implementierung der Fächer z.B. als lineare Listen und ein Feld der Größe m zum Speichern der Listenköpfe. Gesamtzeitaufwand: O(n + m) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 60 30 Spezialfall 2: Alle n Wörter haben gleiche Länge k. Schreibweise: i-tes Wort: xi = x1i x2i ... xki Vorteilhaft, zunächst nach dem k-ten Symbol zu sortieren, dann nach dem (k-1)-ten, usw. Damit k „Läufe“ über die Menge der Wörter. Jeder Lauf gemäß Spezialfall 1 Laufzeit von O((n + m) · k) ⇒ Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 61 Bsp.: 123 , 124, 223, 324, 321 m = 4, n = 5, k = 3 1. Lauf 324 124 324 124 223 123 321 2. Lauf 3. Lauf 223 123 321 124 123 Vorlesung Algorithmen (RN/MK) 223 324 321 WSI für Informatik, Universität Tübingen 62 31 Wie vermeiden wir Aufwand mit leeren Fächern? Sei sj die Anzahl der im j-ten Lauf nichtleeren Fächer. Ziel: Aufsammeln im j-ten Lauf in O(sj) Schritten und damit Aufwand j-ter Lauf O(sj + n). Erzeuge n· k Paare (j, xi), 1 ≤ i ≤ n , 1 ≤ j ≤ k und sortiere durch Fachverteilung zunächst nach der zweiten und dann nach der ersten Komponente. Nach 2. Lauf liegen im j-ten Fach gerade alle Buchstaben in sortierter Reihenfolge, die an der j-ten Stelle vorkommen. Aufwand 1. Lauf: O(n·k + m) Aufwand 2. Lauf: O(n·k + k) Σ : O(n·k + m) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 63 Allgemeiner Fall: n Wörter beliebiger Länge n |xi| =: li , L := ∑r i =1 i , rmax := maxi {ri} Beachte: xi nicht „zu früh“ in Fachverteilung miteinbeziehen; erst bearbeiten, wenn nach dem ri-ten Buchstaben sortiert wird. ( Sortiere Wörter zunächst der Länge nach ...) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 64 32 Algorithmus: 1 Bestimme ri ∀i und erzeuge Paare (ri, Verweis auf xi) 2 Sortiere (ri, Verweis auf xi) durch Fachverteilung nach 1. Komponente. Bezeichne Länge[k] die Liste der Elemente der Länge k. 3 Erzeuge L Paare (j, xji), 1 ≤ i ≤ n , 1 ≤ j ≤ ri und sortiere sie nach der 2. Und dann der 1. Komponente. 2. Fachverteilung liefert lineare Listen Nichtleer[j], 1 ≤ j ≤ rmax i. Lösche Duplikate aus Nichtleer[j]. 4 Sortiere nun die Wörter xi durch Fachverteilung wie oben beschrieben. (unter Berücksichtigung von Länge[k]) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 65 Eine einfache Analyse zeigt: Satz: Sortieren durch Fachverteilung sortiert n Wörter der Gesamtlänge L über einem Alphabet der Größe m in Zeit O(m + L). Anwendung: Sortieren n reeller Zahlen x1, ...,xn Vereinfachung: Betrachte reelle Zahlen aus (0,1]. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 66 33 2.6 Hybridsort ∈ R fest, k := ⋅ n 1 Schaffe k leere Körbe. Wirf xi in den Korb k ⋅ xi für 1 ≤ i ≤ n . 2 Wende Heapsort auf jeden Korb an und konkateniere die Körbe, d.h. reihe sie hintereinander auf. Mitteilung: 1. Worst Case Laufzeit von Hybridsort ist O(n log n). 2. Wenn xi unabhängig gemäß Einheitsverteilung aus (0,1] gewählt, dann hat Hybridsort mittlere Laufzeit O(n). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 67 3.Auswählen Gegeben: Menge S von n Schlüsseln und natürliche Zahl k (1 ≤ k ≤ n) Gesucht: k-t-größter Schlüssel in S n n Spezialfall: k = (bzw. k = ) 2 2 Mediansuche Triviale Lösung in Zeit O(n log n) : Erst sortieren, dann auswählen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 68 34 3.1 Randomisierte Auswahl Idee: Möglichst gleichmäßige, rekursive Partionierung der Eingabe Algorithmus: if n=1 r L R if then return S[1], gefunden Zufallsinteger ∈{1,..., n} { x ∈ S | x ≤ S [r ]} { x ∈ S | x > S [r ]} k≤L then wähle k-t-größtes Element in L else wähle (k − L ) − t-größtes Element in R fi Vorlesung Algorithmen (RN/MK) Satz: WSI für Informatik, Universität Tübingen 69 Der k-t-größte Schlüssel einer Schlüsselmenge mit n Schlüsseln kann in erwarteter Zeit O(n) bestimmt werden Beweis: t(n) Laufzeit des obigen Algorithmus; da rand. Algorithmus, ist t(n) Zufallsvariable. Bestimmen E(t(n)), d.h. Erwartungswert von t(n). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 70 35 Partition von S in L und R heiße gut, falls: 3n 3n L≤ und R ≤ 4 4 Partition ist mit Wahrscheinlichkeit 12 gut. g(n):= # rek. Aufrufe bis gute Partition erreicht wird. 3n Dann gilt: t (n) ≤ bn ⋅ g (n) + t 4 insbesondere t(1)=b. 3n Es gilt: E (t (n)) ≤ E bn ⋅ g (n) + t 4 3n = bn E ( g ( n)) + E t 4 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 71 1 1 1 E ( g (n)) = 1 ⋅ + 2 ⋅ + 3 ⋅ + ... = 2 2 4 8 Also: 3n E (t (n)) ≤ E t + 2bn 4 log n 3n i ⇒ E (t ( n)) ≤ 2bn ∑ i =0 4 ⇒ E (t ( n)) = O (n) 4 Vorlesung Algorithmen (RN/MK) 3 WSI für Informatik, Universität Tübingen 72 36 3.2 Deterministische Auswahl Idee: bestimme Median (=ˆ Pivotelement) per Sampling... Algorithmus: n 1. Unterteile Schlüsselmenge S in 5 Mengen mit je (bis zu) fünf Schlüsseln 2. Finde Median jeder Fünfermenge in O(1) Zeit n 3. Wende det. Auswahl rekursiv auf Menge der 5 vielen Fünfer-Mediane an, um den „Median der Mediane“ x zu finden 4. Partioniere nun S bzgl. x in L und R (analog zur rand. Auswahl) 5. Wende det. Auswahl rekursiv auf L an, falls L ≥ k und sonst auf R (mit neuem Par. k − L ) Vorlesung Algorithmen (RN/MK) Satz: WSI für Informatik, Universität Tübingen 73 Der k-t-größte Schlüssel einer Schlüsselmenge mit n Schlüsseln kann in Worst Case Zeit O(n) bestimmt werden Beweis: Zentral zu bestimmen: Güte der Partionierung Es gilt: Mind. Hälfte der in Schritt 2 gefundenen Mediane ≥ x ⇒ 1 n ⋅ −2 2 5 Fünfermengen beinhalten mind. 3 Elemente > x 1 n 3n ⇒ 3 ⋅ − 2 ≥ − 6 Elemente > x 2 5 10 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 74 37 Analog: # (Elemente < x) ≥ 3n −6 10 ⇒ Im schlimmsten Fall in Schritt 5 rekursiver Aufruf mit 7n + 6 Schlüsseln 10 ⇒ Rekursionsgleichung für worst case Laufzeit T (n) : 7n + 6 < n falls n > 20 Benutze hierbei 10 O(1), falls n ≤ 80 T ( n) ≤ T n + T 7 n + 6 + O(n) , falls n > 80 { 5 10 12 3 142 43 Schritte 2+ 4 Schritt3 Schritt5 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 75 Lsg. mit Substitutionsmethode: Annahme: T (n) ≤ cn für c = const einsetzen : 7n n T ( n) ≤ c + c + 6 + O(n) 5 10 cn 7cn ≤ +c+ + 6c + O(n) 5 10 9cn ≤ + 7c + O ( n) 10 ≤ cn n falls c groß genug, sodass c − 7 größer als die 10 in O(n) „versteckte Funktion“. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 76 38 4. Balancierte Bäume 5 2 Einfügen, Streichen Bsp.: {2, 3, 5, 7, 11, 13, 17} 7 3 13 11 17 Knoten hat Verweis auf linkes und rechtes Kind (lchild, rchild) Oft auch Verweis auf Elternknoten. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 77 Knotenorientierte Speicherung: 1. Ein Element pro Knoten 2. Alle Elemente im linken Teilbaum von v < Element an v < alle Elemente im rechten Teilbaum von v, für alle v Blattorientierte Speicherung: 1. Ein Element pro Blatt 2. Alle Elemente im linken Teilbaum von v ≤ Schlüssel an v < alle Elemente rechts 4 2 6 2 3 5 10 7 Vorlesung Algorithmen (RN/MK) 11 WSI für Informatik, Universität Tübingen 78 39 Benutzen knotenorientierte Speicherung Suche (x): u Wurzel; found false while (u < > 0) and not found do if info(u) = x then found else if x < info(u) then u else u rchild(u) true lchild(u) Einfüge (x): Zuerst Suche (x). Sei u der zuletzt besuchte Knoten. u hat höchstens ein Kind (oder x ∈ S ). Falls x < Info(u), erzeuge neuen Knoten mit Beschriftung x als linkes Kind von u, andernfalls als rechtes Kind. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 79 Streiche (x): Zuerst Suche (x). Ist x ∈ S , endet Suche in Knoten u mit info(u) = x. Fall 1: u ist Blatt. Streiche u u Fall 2: u hat nur ein Kind w. Streiche u und setze w an die Stelle von u als Kind von u‘s Elternknoten. v w u w Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 80 40 Fall 3: u hat 2 Kinder. Suche Knoten v mit größter Beschriftung im linken Teilbaum von u. (Einmal nach links, dann nach rechts, bis es nicht mehr geht). v hat höchstens Kind (evtl. lchild). Ersetze u durch v, und streiche v an alter Stelle mit Fall 1 oder Fall 2. u 8 7 2 9 1 2 5 10 3 7 4 6 Vorlesung Algorithmen (RN/MK) v 9 1 5 3 10 6 4 WSI für Informatik, Universität Tübingen 81 Komplexität: O(h + 1), wobei h Höhe des Suchbaums kann sehr schlecht sein: Idee: 1. Hoffen, dass das selten vorkommt. 2. Baue Baum von Zeit zu Zeit neu auf (ausgewogen) 3. Balancierte Bäume! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 82 41 4.1 Balancierte Bäume: AVL-Bäume Def.: Sei u Knoten in binärem Baum. Balance: Bal(u) = Höhe des rechten Teilbaums von u - Höhe des linken Teilbaums von u -1 -1 Def.: Ein binärer Baum heißt AVL-Baum, falls Bal(u ) ≤ 1 für alle Knoten u. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 83 Def.: Fibonacci-Bäume T0, T1, T2 sind definiert durch T0 = leerer Baum T1 = Tn = für n ≥ 2 Tn-1 Tn-2 Fibonacci-Zahlen F0, F1, ... : F0 = 0, F1 = 1, Fn= Fn-1 + Fn-2 Behauptung: Th enthält genau Fh Blätter für h ≥ 0. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 84 42 Behauptung: AVL-Baum der Höhe h enthält ≥ Fh Blätter. Beweis: Durch Induktion über h. h = 0: OK h = 1: OK h ≥ 2 : Man erhält blattärmsten AVL-Baum der Höhe h, indem man blattärmsten AVL-Baum der Höhe h – 1 mit dem blattärmsten der Höhe h – 2 kombiniert. Tn-1 Nach Induktionsannahme hat der Baum ≥ Fh −1 + Fh − 2 = Fh Blätter. Tn-2 Behauptung: Für h ≥ 0 ist Fh = = 1+ 5 und 2 Vorlesung Algorithmen (RN/MK) − h mit 5 1- 5 = . 2 h (Induktion) WSI für Informatik, Universität Tübingen 85 Lemma: Ein AVL-Baum mit n Knoten hat Höhe O(log n). Beweis: Der Baum hat ≤ n Blätter. h − h ≤ n. Also Fh ≤ n oder 5 h Da β < 1 : ⇒ n≥ ⇒ h h log ( − 5 h ≥ h 2 5 für h groß genug. h 2 5 ≤ 2 5n ) ≤ log(2 ) log (2 5 ) + log n h≤ = O (log n ) 5 + log n log Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 86 43 Einfügen / Streichen: Beschriften jeden Knoten v mit seiner Balance Bal(v). Einfügen: Durch Einfügen eines Knotens w können Balancen einiger Vorfahren von w Werte ± 2 annehmen. Sei u der tiefste dieser Vorfahren. O.B.d.A. sei Bal(u) = 2. w wurde also im rechten Unterbaum von u eingefügt. Sei v rechtes Kind von w. Beachte: Bal(v) ≠ 0, da Höhe von v verändert wurde. Fall 1: Bal(v) = 1 u A v B Rotation ⇒ C Vorlesung Algorithmen (RN/MK) A B C WSI für Informatik, Universität Tübingen 87 Beachte: (1) Die Rotation bewahrt die links-nach-rechts-Ordnung. A-u-B-v-C. (2) u und v haben nach der Rotation die Balance 0. Alle Knoten in A, B und C haben die gleiche (legale) Balance wie vor der Rotation. (3) Höhe von v nach der Rotation ist gleich der Höhe von u vor dem Einfügen von w. Also sind nach der Rotation keine Vorfahren von v unbalanciert. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 88 44 Fall 2: Bal(v) = –1 u oder (B,C) vertauscht. 2 v A –1 z C D Do Ro ppeltati on B z u A Vorlesung Algorithmen (RN/MK) 0 0 / –1 B 1/0 C D WSI für Informatik, Universität Tübingen 89 Einfügealgorithmus: Füge neues Blatt w ein. Dann folge dem Pfad von w zur Wurzel, wobei alle Balancen neu berechnet werden. Tritt eine Balance ± 2 auf, dann führe Rotation oder Doppelrotation aus. Beende das Einfügen. Laufzeit: O(Höhe des Baums) = O(log n), n = # Knoten Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 90 45 Streichen: Wie beim Einfügen können Knoten Balance ± 2 annehmen. Sei u der tiefste solche Knoten, sei Bal(u) = 2, und sei v das rechte Kind von u. Fall 1: Bal(v) = 1; balanciere wie beim Einfügen. Fall 2: Bal(v) = –1; analog. Unterbäume B und C können jetzt beide die gleiche Tiefe haben. Im Fall 1 und 2 hat der betroffene Baum nach der Balancierung kleinere Höhe als vor dem Streichen. Balancierung muß daher höher im Baum fortgesetzt werden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 91 Fall 3: Bal(v) = 0 Rotation ⇒ v A B C A B C In diesem Fall muß die Balancierung nicht höher im Baum fortgesetzt werden. Satz: Balancierte Bäume, wie AVL-Bäume, erlauben Suchen, Einfügen und Streichen in O(log n) Zeit, wo n die Knotenanzahl ist. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 92 46 Anwendung von balancierten Suchbäumen: Schnitt von achsenparallelen Liniensegmenten Gegeben: Menge von insgesamt n vertikalen und horizontalen Liniensegmenten in der Ebene. Gesucht: Alle Paare von sich schneidenden Elementen Trivialer Algorithmus: O(n²) Anwendung z.B. bei VSLI-Schaltkreisen: VLSI-Designer will keine unerwarteten „Drahtüberschneidungen“... Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 93 Vereinfachende Annahme nachfolgend: Alle Anfangs- und Endpunkte horizontaler Segmente und alle vertikale Segmente haben paarweise verschiedene x-Koordinaten. Idee: Vertikale „Sweepline“ geht Ebene von links nach rechts durch; jedes aktuell von Sweepline abgedeckte vertikale Segment kann höchstens Schnittpunkte mit gerade „aktiven“ horizontalen Segmenten haben. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 94 47 Algorithmus: x − Koordinaten der Anfangs- und Endpunkte Q← horizontaler Segmente ∪ {x − Koordinaten von vertikalen Segmenten} ; Sortiere Q bzgl. x-Werten; L ← o/ ; / * Menge jeweils aktiver horizontaler Segmente in aufsteigender y - Reihenfolge * / Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 95 while Q ≠ o/ do p ← kleinstes Element in Q ; if p linker Endpunkt eines horizontalen Segments s then L ← L ∪ {s} else if p rechter Endpunkt eines horizontalen Segments s then L ← L \ {s} else /*p ist x-Wert eines vertikalen Segments s = ( p, yu ), ( p, yo ) * / Bestimme alle horizontalen Segmente t ∈ L mit yu ≤ y (t ) ≤ yo und gib (s,t) aus. fi; [ ] fi; od; Q ← Q \ {p} Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 96 48 Zur Laufzeit des Algorithmus: Einmaliges sortieren von Q: O(n log n) Wichtig: Wie hält man L geordnet? Beachte: Die Information in Q ist quasi statisch, die in L dynamisch. Wir benötigen folgende Operationen auf L: -Einfügen&Entfernen -Bestimmen aller Elemente, die in geg. Bereich[ yu , yo ] fallen: „Bereichsanfrage“, Range Query → Implementation von L mit balanciertem Suchbaum mit blattorientierter Speicherung, wobei benachbarte Blätter verkettet sind. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 97 Damit: O(log n) für Einfügen und Entfernen und O(log n + r) für Bereichsanfrage in Bereich yu , yo , wobei r :=# Elemente in yu , yo . [ [ ] ] Zusammen: Laufzeit O(n log n + k), wobei k die Gesamtzahl sich schneidender Segmente ist. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 98 49 4.2 B-Bäume Für große Datenmengen, die nicht mehr in den Hauptspeicher passen, sind AVL-Bäume ungeeignet. Hier kommen B-Bäume zum Zug, die für Zugriff auf externe Speicher entworfen wurden. Definition: Ein B-Baum der Ordnung k ≥ 2 ist ein Baum, - dessen Blätter alle gleiche Tiefe haben, - die Wurzel mindestens 2 Kinder und jeder andere - innere Knoten mind. k Kinder hat und - jeder innere Knoten höchstens 2k-1 Kinder besitzt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 99 Lemma: Sei T ein B-Baum der Ordnung k mit Höhe h und h n Blättern. Dann gilt: 2 ⋅ k h −1 ≤ n ≤ (2k − 1) Beweis: Minimale Anzahl von Blättern, falls jeder innere Knoten die Minimalzahl von Kindern hat: 2 ⋅ k14 ⋅ k2 ⋅ ...4 ⋅ k = 2 ⋅ k h−1 = nmin ≤ n 3 h −1 Analog folgt, dass die maximale Anzahl der Blätter höchstens (2k − 1)h =: nmax ist. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 100 50 Logarithmieren ergibt: log ( 2 k −1) n ≤ h ≤ 1 + log k n 2 ⇒ Wähle bei großen Datenmengen k so, dass auf eine Seite ein Knoten des B - Baums passt. Operationen: Zugriff, Einfügen, Streichen Annahme: Wir speichern knotenorientiert; nichts in den Blättern. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 101 Betrachte Knoten u mit l Kindern: u s1 s2 ... si-1 ... si ... sl-1 Ti . . . u hat Schlüssel s1 , s2 ,..., sl −1. (geordnet!) Sei Ti der i-te Unterbaum von u v gilt : Für alle v ∈ Ti und alle Schlüssel„ s ∈„“ s ≤ si , falls i = 1 si −1 ≤ s ≤ si , falls 1 < i < l si ≤ s, falls i = d Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 102 51 Zugriff auf (a,S): Starte in Wurzel w und suche den kleinsten Schlüssel si in w mit a ≤ si . Falls si existiert: if a = si then gefunden else w ← i - tes Kind von w ; suche rekursiv weiter fi Falls si nicht existiert : w ← rechtestes Kind ; suche rekursiv weiter Laufzeit: O((log k n ) ⋅ k ) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 103 Einfügen (a,S): (Erfolglose) Suche ende in Blatt b mit Elternknoten v, welcher l Kinder hat. Sei si der kleinste Schlüssel in v mit a<si (falls existent). Füge neuen Schlüssel a in v ein und neues Blatt b′ für a, sodass a links von si , falls i=1 a zwischen si-1 und si , falls 1<i<l a rechts von sl-1 , falls si nicht existent Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 104 52 Also: v s1 s2 ... sl-1 s1 s2 14444 4244444 3 l Blätter ... si-1 a si ... sl-1 144444 42444444 3 l + 1 Blätter Falls l < 2k − 1 ⇒ OK. Falls l = 2k − 1 : Spalte v in zwei Knoten v′ und v′′ mit jeweils k Kindern Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 105 Bild: w v sk w s1 s2 ... s2k-1 v ′ s1 . . . sk-1 v′′ sk . . . s2k-1 14444244443 2k Kinder w bekommt ein Kind mehr und auch einen Schlüssel sk mehr. Setze Aufspalten falls nötig zur Wurzel des B-Baums hin fort. Beachte: Tiefe des Gesamtbaums bleibt erhalten, außer wenn die Wurzel aufgespalten werden muss. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 106 53 Streichen eines Schlüssels aus einem B-Baum: Streiche (a,S) Annahme: a = sj kommt in Knoten u vor. Mittels Zugriff (a,S) suche zunächst Knoten u, in dem a als Schlüssel sj vorkommt. Wir nehmen an, die Suche ende erfolgreich. allg. Situation: .......... sj-1 Tj ............. u sj Tj+1 Fallunterscheidung: 1.) Falls Tj ein Blatt ist, so lösche sj und Tj. 2.) Tj ist kein Blatt: Sei s der rechteste Schlüssel in Tj. Ersetze sj durch s und lösche s samt „rechtestem“ Blatt in Tj. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 107 Situation: .... sj-1 sj sj+1 .... v s .... sj-1 s sj+1 .... v (ohne s) Sei v der Knoten, in dem s (rechtsaußen) vorkomme. Zahl der Kinder in v ist damit um 1 verringert: Sei r die ursprüngliche Zahl der Kinder in v mit k ≤ r ≤ 2k − 1. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 108 54 a) Falls r > k (bzw. r > 2, falls v Wurzel), so fertig, da B-BaumEigenschaft gewahrt bleibt. b) Falls k= 2 und v Wurzel ist, so hat v nach Entfernung von s nur noch ein Kind. Dann „streiche“ die Wurzel. Alle Blätter bleiben auf gleicher Tiefe, die Baumhöhe verringert sich um 1. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 109 c) Sei r = k und v keine Wurzel. Sei w Elternknoten von v und v´ ein „direkter“ Geschwisterknoten links von v. Weiter sei s´ der Schlüssel in w zwischen den Verweisen auf v und v´. Also: .... s´´ s´ .... s1´ .... sr´ s1 s2 .... sk-2 k ≤ r + 1 ≤ 2k − 1 Verschmelze v und v´: .... s´´ .... w s1´ .... sr´ s´ s1 .... sk-2 vneu vneu hat jetzt mind. 2k-1 und höchstens 3k-2 Kinder. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 110 55 ) Falls vneu mehr als 2k-1 Kinder hat, so spalte vneu wieder in zwei Knoten auf (wie beim Einfügen), um die B-Baum-Eigenschaft zu erfüllen: Jedes der Kinder hat dann mind. k und 3k höchstens - 1 Kinder. 2 ) Falls vneu genau 2k-1 Kinder hat, so muss nicht gespalten werden. Jedoch hat w nun ein Kind verloren und so muss rekursiv mit w fortgefahren werden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 111 Zusammenfassend ergibt sich: Satz: Zugriff / Einfügen / Streichen kann in B-Bäumen der Ordnung k, welche n Schlüssel verwalten, in Zeit O(k ·logk n) durchgeführt werden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 112 56 5.Hashing Hash-Tafeln („Streutafeln“) dienen zur Implementierung von „Wörterbüchern“ (Dictionaries) und sollen daher die Operationen Zugriff, Einfügen und Streichen unterstützen. Ausgangslage: Geg.: Universum U = [0 ... N-1], S ⊆ U ist die zu verwaltende Menge. Operationen: Zugriff(a,S), Einfügen(a,S), Streichen(a,S) Grundprinzip ist es, die „wenigen“ Elemente von S („|S| << |U|“) in einem kompakten Array T mit Hilfe einer Hash-Funktion h: U [0 ... m-1] abzuspeichern. Ein Element x ∈ S wird dann in T[h(x)] abgespeichert. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 113 Beispiel: m = 5, S = {3, 15, 22, 24}, U = [0 ... 99] h(x) = x mod 5 Hash-Tafel T: 0: 1: 2: 3: 4: 15 22 3 24 Offensichtlich: Problem von Kollisionen, d.h. h(x) = h(y) für x ≠ y. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 114 57 Forderungen an Hash-Funktionen: - Einfache Berechenbarkeit - Minimierug der Kollisionsanzahl Zwei Hauptmethoden zur Kollisionsbehandlung: - Hashing mit Verkettung und - Hashing mit offener Adressierung Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 115 5.1 Hashing mit Verkettung Hash-Tafel als Array von linearen Listen realisiert. Die i-te Liste ( 0 ≤ i < m ) enthält alle Elemente x ∈ S mit h(x) = i. Worst Case: Alle Elemente in einer Liste abgespeichert alle Operationen erfordern lineare Laufzeit O(|S|). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 116 58 Im Durchschnitt aber viel besseres Verhalten. Um diesen zu analysieren, machen wir folgende Annahmen: (*) 1) h(x) in O(1) Schritten berechenbar. 2) Hash-Funktion h: U [0 ... m-1] verteilt das Universum „gleichmäßig“ auf das Intervall [0 ... m-1], d.h. U h −1 (i ) ≤ ∀i = 0, ..., m − 1 m 3) Alle Elemente von U sind mit gleicher Wahrscheinlichkeit Argument einer Operation in einer Sequenz von Operationen, d.h. das Argument der k-ten Operation der Sequenz ist ein festes x ∈ U mit Wahrscheinlichkeit 1/|U|. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 117 Mit Annahmen 2) und 3) folgt: Sei xk Argument der k-ten Operation. Dann Prob(h(xk) = i) = 1 m ∀ k ∈ [1 ... n] ∀ i ∈ [0 ... m-1] , wobei n die Anzahl der Operationen sei. Satz: Es gelten die Annahmen (*). Nehmen wir an, dass n Operationen stattfanden. Dann sind die erwarteten Kosten einer n darauffolgenden Operation O (1+ ) , wobei = . m Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 118 59 Beweis: Schlimmstenfalls vorher n Einfügungen in die Tafel, sodass dies die maximale Kollisionswahrscheinlichkeit ergibt. Angenommen h(xn+1) = i. Prob(Ln(i) = j) Wahrscheinlichkeit, dass die i-te Liste nach der n-ten Operation Länge j hat. Dann gilt n EK n +1 ≤ ∑ Prob(Ln (i ) = j )(1 + j ). j =0 Weiter gilt n 1 1 Prob(Ln (i ) = j ) ≤ 1 − j m m j Vorlesung Algorithmen (RN/MK) n− j . WSI für Informatik, Universität Tübingen n n 1 EK 1 ≤ + Daraus folgt: ∑ n +1 j = 0 j m j 119 n-j 1 1- ⋅ j m n n − 1 1 = 1 + ∑ n j =1 j − 1 m j 1 1 − m n n n − 1 1 = 1 + ∑ m j =1 j − 1 m j −1 n− j 1 1 − m n n −1 n − 1 1 1 1 − = 1 + ∑ m j =0 j m m j n 1 1 = 1 + + 1 − m m m = 1+ Vorlesung Algorithmen (RN/MK) n −1− ( j −1) n −1− j n −1 n = 1+ m WSI für Informatik, Universität Tübingen 120 60 Bei obigem Satz Annahme (*). 3) am kritischsten – eher selten Zugriff auf Hash-Tafel gleichverteilt ... (Bsp. Symboltabellen (Compiler)). Aus Wissen über „Zugriffsverteilung“ läßt sich aber ggf. eine bessere Hash-Funktion konstruieren und zuweilen sogar bessere (erwartete) Laufzeiten erzielbar. Weiterhin hängen erwartete Kosten von Belegungsfaktor n = ab: m = const. ⇒ erwartete Kosten konstant. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 121 Problem: Wahl von m: - m (zu) groß hohe Speicherkosten und mitunter erhöhte Laufzeit. - m (zu) klein erwartete Kosten (zu) hoch. Fazit: Mit Einfügen bzw. Streichen kann oder zu klein werden. schnell zu groß Lösungsansatz: „Rehashing“: Idee: Benutze Folge T0, T1, T2, ... von Hash-Tafeln der Größen m, 2m , 4m, ... zusammen mit jeweiligen Hash-Funktionen h0, h1, h2, ... Beginn mit T0. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 122 61 1) Wenn in Ti (der Größe 2i·m) nun = 1 Speichere in Ti+1 um 1 neuer Belegungsfaktor ´= 2 1 2) Wenn in Ti nun = 4 Speichere in Ti-1 um (mit Ausnahme von i = 0) 1 neuer Belegungsfaktor ´= 2 1 1 Nach Rehashing gemäß 1) mindestens ⋅ 2i +1 ⋅ m = ⋅ 2i m 4 2 Operationen bis zum nächsten Rehashing möglich. 1 i −1 ⋅2 ⋅m 4 Operationen bis zum nächsten Rehashing möglich. Nach Rehashing gemäß 2) mindestens Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 123 In beiden Fällen Rehashing-Kosten somit höchstens um Faktor 2 größer als die danach bei „günstigem“ Belegungsfaktor mindestens ausführbaren Operationen. D.h., dass „amortisiert“ die erwarteten Kosten pro Operation immer konstant gehalten werden können, ohne allzu viel Speicher zu verschwenden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 124 62 5.2 Hashing mit offener Adressierung Grundidee: Jedes Element x ∈ U definiert Folge h(x,i), i = 0, 1, 2, ... von Tafelpositionen. Diese Sequenz durchzugehen, wann immer eine Operation mit x ausgeführt werden soll. Oft h(x,i) als Kombination zweier Hash-Funktionen gewählt: h(x,i) = [h1(x) + i·h2(x)] mod m Vorteil: Kein zusätzlicher Speicherbedarf. Nachteil: Schlechte Leistung bei Belegungsfaktor nahe 1 und keine Unterstützung des Streichens. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 125 5.3 Perfektes Hashing Hash-Funktion sollte injektiv sein, falls S bekannt ist. Grundschema: Stufe 1 arbeitet mit Hashing mit Verkettung kreiert „kurze“ Listen Stufe 2 benutzt für jede Liste eine eigene, injektive Hash-Funktion Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 126 63 Zunächst zur Wahl einer injektiven Hash-Funktion: Sei U = {0, 1, ..., N-1} und sei [0 ... m-1] Hash-Funktion hk : {0, ..., N-1} für k ∈{1, ..., N-1} mit hk (x) := ((kx) mod N) mod m. Sei S ⊆ U mit |S| = n bekannt. Für welches k ist hk injektiv? Messung der „Injektivität“ vermöge: bik := {x ∈ S : hk ( x ) = i} für 1 ≤ k ≤ N-1, 0 ≤ i ≤ m-1 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 127 Dann bik ⋅ (bik − 1) = { (x,y )∈ S 2 } x ≠ y, hk ( x ) = hk ( y ) = i Anzahl der Paare mit Wert i, die „Injektivität“ verletzen. m −1 Sei Bk := ∑ bik (bik − 1). Somit Zahl der Paare in S2, die i =0 „Injektivität von hk“ verletzen: Bk ≈ 2# Kollisionen, falls hk benutzt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 128 64 Lemma: Voraussetzungen wie oben. Dann 1. Bk < 2 gdw. hk|S injektiv. n ∀i ∈ {0, ..., m-1} 2. Falls bik = m (d.h. gleichverteilt), dann m −1 Bk = ∑ i =0 nn n − 1 = n − 1 mm m Beweis: 2. Offensichtlich per Def. m −1 1. " ⇒": Bk < 2 ⇔ ∑ bik (bik − 1) ∈ {0 , 1} ⇒ ∀i:bik ∈ {0 , 1} i =0 ⇒ hk " ⇐ ": hk S S injektiv. injektiv ⇒ ∀i bik ∈ {0 , 1} ⇒ Bk = 0 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 129 Lemma: Voraussetzungen wie oben, desweiteren sei N Primzahl. Dann gilt N −1 n −1 ∑∑ b (b − 1) ≤ 2 ⋅ k =1 i = 0 142 4 43 4 ik ik n(n − 1) (N − 1) m Bk Bemerkung: Lemma ⇒ ⇒ n(n − 1) mittlere Anzahl der Kollisionen ≤ m (da Bk ≈ 2⋅# Koll´en bei Benutzung von hk ) Mit m > n(n-1) ist mittlere Anzahl < 1 und d.h., es gibt hk, das auf S injektiv ist! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 130 65 Beweis des Lemmas: N −1 m −1 ∑∑ b (b k =1 i = 0 ik ik − 1) N −1 m −1 = ∑∑ k =1 i = 0 = { (x,y ) ∑ {k ( x,y )∈S 2 x,y ∈ S, x ≠ y, hk ( x ) = hk ( y ) = i} hk ( x ) = hk ( y ) } x≠ y Seien x, y ∈ S fest. Wieviele Funktionen hk mit hk(x) = hk(y) gibt es? Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 131 hk(x) = hk(y) (k·x mod N) mod m = (k· y mod N) mod m ⇔ ⇔ ((k· x mod N) – (k·y mod N)) mod m = 0 =: g(k) Es gilt − N + 1 ≤ g (k ) ≤ N − 1 und g (k ) = i ⋅ m − N + 1 N − 1 i ∈ ,..., m m mit Behauptung: Für jedes i gibt es höchstens ein k mit g(k) = i·m. {k h (x ) =h ( y )} = 2 ⋅ N − 1 Falls Beh. wahr, so gilt: k N −1 m −1 Gesamtsumme: ∑∑ b (b k =1 i = 0 Vorlesung Algorithmen (RN/MK) ik ik k − 1) ≤ 2 ⋅ m N −1 n(n − 1) m WSI für Informatik, Universität Tübingen 132 66 Beweis der Behauptung: Seien k1, k 2 ∈ [0 ... N-1] mit g(k1) = g(k2): g(k1) = g(k2) ⇔ ⇒ ⇔ k1x mod N – k1y mod N = k2x mod N – k2y mod N (k1x – k1y) – (k2x – k2y) mod N = 0 ((k1 – k2)(x – y)) mod N = 0 Da Z|N Körper, folgt entweder k1 – k2 mod N = 0 oder x – y mod N = 0. Wegen x, y, k1, k 2 ∈ [0 .. N − 1] und x ≠ y folgt k1 = k 2. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 133 Korollar 1: Voraussetzungen wie oben (Lemma). 1. ∃k ∈ [1K N-1]:Bk ≤ 2 ⋅ 2. Mindestens n(n − 1) m 4n(n − 1) N -1 viele hk ’s haben Bk ’s mit Bk ≤ . 2 m n(n − 1) ist Mittelwert, ein hk muss Bk mit m diesem oder kleinerem Wert haben ... Beweis: 1. 2⋅ N −1 4n(n − 1) 2. Sei A := k Bk > -Annahme: A > . . 2 m N −1 N − 1 4n(n − 1) n(n − 1) Dann ∑ Bk ≥ ∑ Bk > (N − 1) ⋅ =2 2 m m k =1 k∈ A im Widerspruch zum Lemma! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 134 67 Korollar 2 Teil 1 n(n − 1) 1. Ein k ∈ [1K N − 1] mit Bk ≤ 2 m in Zeit O(m + Nn) bestimmbar. 2. Sei m = n(n – 1)+1. Dann gibt es k derart, dass hk|S injektiv. k in Zeit O(n2+Nn) zu finden. 3. Sei m = 2n (n – 1) +1. Dann mind. Hälfte der hk|S injektiv. Bestimmungszeit O(n2) randomisiert. Beweis: 1. Teste alle k durch. Es gibt N – 1 verschiedene k´s und n versch. x ∈ S . „Wirf x´e in Fächer in Ges.zeit O(n·N). Schau jeweils nach, ob Fächer zu „voll“ (Zeit O(m)).“ 2. Einsetzen bei 1. liefert Bk < 2 ⇒ injektiv! 3. Einsetzen in Kor.1, Teil 2 ⇒ Mind. Hälfte der hk´s haben Bk´s mit Bk < 2 ⇒ Mind. Hälfte der hk´s injektiv. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 135 Korollar 2 Teil 2 n(n − 1) 4. k ∈ [1K N − 1] mit Bk ≤ 4 randomisiert m in Zeit O(m + n) bestimmbar. 5. Sei m = n. k mit Bk ≤ 2(n − 1) in Zeit O(n·N) zu finden. 6. Sei m = n. k mit Bk ≤ 4(n − 1) randomisiert in Zeit O(n) zu finden. n(n − 1) 1 Beweis: 4. Prob Bk < 4 ≥ m 2 ⇒ ... „randomisiert“ trifft man ein solches k in Zeit O(m + n). 5. Einsetzen bei 1. 6. Einsetzen bei 4. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 136 68 Zur Realisierung: Stufe 1: Sei m = n. Gemäß Kor. 2, 1. gibt es dann Hash-Fkt. hk, sodass Listenlängen alle O n . ( ) m −1 Denn: ∑ bik (bik − 1) = Bk ≤ 2 i =0 Def . Kor.2,1. ( ) n(n − 1) n = m = 2(n − 1) m ( ) ⇒ bik ∈ O n ∀i , d.h. Listenlängen O n . Stufe 2: Auf jede dieser Teilmengen ( nochmals Hashing an. Vorlesung Algorithmen (RN/MK) Listen) wende WSI für Informatik, Universität Tübingen 137 Die Einzelheiten: Sei S ⊆ [0 .. N-1] , N Primzahl, S = n = m : 1. Wähle k mit Bk ≤ 4(n − 1) ≤ 4n. Sei hk = ((kx) mod N) mod m. 2. Sei wi = {x ∈ S : hk ( x ) = i}, bi = wi und mi: = 2bi (bi − 1) + 1 Wähle ki mit h k(x) = ((kix) mod N) mod mi, sodass i hki injektiv für wi. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 138 69 3. Sei si := ∑ m j j <i Dann speichere x ∈ S in Tafelposition T [si + j ] , wobei und i = ((kx ) mod N ) mod m j = ((ki x ) mod N ) mod mi . Bild: w0 0 w1 m0-1 m0 = s1 s ((kx) mod N) mod n : : : : s2-1 : wn-1 Vorlesung Algorithmen (RN/MK) sn-1 mn-1+sn-1-1 WSI für Informatik, Universität Tübingen 139 Komplexitätsanalyse: Platzbedarf: m −1 n −1 ∑ mi = ∑ [2bi (bi − 1) + 1] = n + 2Bk i =0 i =0 ≤ n + 8(n − 1) = 9n − 8 = O(n ). Kor.2, 6 Laufzeit: Schritt 1: O(n) randomisiert nach Korollar 2, 6. ( ) Schritt 2: O(n) randomisiert, da bi = O n in Kor. 2, 3. Schritt 3: O(mi + bi) für jedes ki, d.h. insges. O(n). ∑: O(n + m) = O(n) randomisiert! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 140 70 Satz: Voraussetzungen wie oben. Dann kann für S perfekte Hash-Tafel der Größe O(n) und Hash-Funktion mit O(1) Zugriffszeit deterministisch in Zeit O(n·N) und randomisiert in O(n) erwarteter Zeit aufgebaut werden. Bemerkung: Randomisierte Version sehr zu bevorzugen! Wie macht man es nun wirklich, speziell „on-line“? Szenario: Starte mit leerer Hash-Tafel, füge x1 ein, dann x2 usw. Beim i-ten Durchgang nur x1, ..., xi bekannt. Grundschema: Falls auf Stufe 1 zu viele Kollisionen, oder auf Stufe 2 nicht injektive Hash-Funktion, so verändere Hash-Funktion bzw. -Tafel. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 141 Tafelaufbau: Wähle k ∈ [1 .. N-1] ; for i = 0 to n – 1 do Initialisierung wähle ki zufällig od; m n; B 0; for l = 0 to n – 1 do Insert(xl) od; Insert(x) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 142 71 Analyse: Tafelaufbau und versuche_wieder können oft vorkommen. versuche_wieder: Test, ob gewähltes ki gut, kostet Zeit O(bi) mi immer groß ( ≥ 2bi (bi − 1) + 1 ) gehalten, sodass ki mit W.´keit ≥ 1 2 injektiv für wi, d.h. im Mittel nur 2mal versuche_wieder, also O(bi) Zeit, um injektive Hash-Funktion für wi zu finden. Sei bif Wert von bi nach allen Einfügungen. Dann ist Gesamtzeit für festes i f bi f 2 ≤ O ∑ j = O bi . j =1 (( ) ) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 143 Tafelaufbau: Passiert, wenn B > 4(n – 1). Nach Kor. 2, 4 bzw. 6 (Beweis) gilt für zufälliges k n −1 1 f f B f = ∑ bi bi − 1 ≤ 4(n − 1) mit W.´keit ≥ 2 i =0 f Da aktuelles B ≤ B , brauchen wir im Mittel ≤ 2 Versuche für k: 2 n −1 ⇒ O(n ) + O ∑ bi f = O(n ) + O B f = O(n ) i =0 Tafelaufbauzeitkomplexität insgesamt ( ) ( ) Vorlesung Algorithmen (RN/MK) ( ) WSI für Informatik, Universität Tübingen 144 72 Platzbedarf: mi wächst während des Einfügens. Seien mi,1, mi,2, ... die versch. Werte für mi und mif der letzte Wert. Es gilt: mi,p +1 ≥ 2mi,p + 1 f ⇒ mi f ≤ 2mi ∑p mi,p ≤ ∑ p p ≥0 2 ⇒ Gesamtplatzbedarf : n-1 n −1 ( ( ) ) ≤ ∑ 2 ⋅ mi ≤ ∑ 8bi bi − 1 + 2 f i =0 i =0 f f ≤ 8 ⋅ 4(n-1) + 2n ≤ 34n Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 145 Satz: Sei N Primzahl und S Teilmenge von U mit |S| = n. Dann kann perfekte Hash-Tafel der Größe O(n) on-line in O(n) erwarteter Zeit berechnet werden. Zugriffszeit ist O(1). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 146 73 6. Graphenalgorithmen Grundlagen: 1. Paar (V, E) heißt gerichteter Graph G, wobei V endl. Menge von Knoten und endl. Menge von Kanten ist. 2 Element e = (v,w) ∈ E 1 3 heißt Kante von v nach w („ v w “) v ist Startknoten von e 5 w ist Zielknoten von e w ist Nachbarknoten von v (w ist adjazent zu v) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 4 147 2. Pfad in G ist Folge (v0, ..., vk) von Knoten mit k ≥ 0 und (vi, vi+1) ∈ E für 0 ≤ i ≤ k − 1. Länge des Pfades ist k. Falls v0 = vk und k ≥ 1, so heißt der Pfad Kreis bzw. Zykel. Falls vi ≠ v j für alle i ≠ j , so heißt der Pfad einfach. Falls es Pfad von v nach w in G gibt, so schreibt man * v → w. G Gerichteter Graph heißt zyklisch, falls er Kreis enthält; sonst azyklisch. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 148 74 6.1 Darstellung von Graphen Annahme: V = {1, 2, ..., n}, G = (V, E), n = |V|. Zwei Darstellungsarten sind üblich: 1. Darstellung: Adjazenzmatrix A = (aij ) , 1 ≤ i,j ≤ n falls (i,j ) ∈ E sonst. 1 , aij := 0 , 1 2 3 4 5 Bsp.: 1 1 2 3 4 5 4 2 3 5 Vorlesung Algorithmen (RN/MK) 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 WSI für Informatik, Universität Tübingen 149 Bei ungerichteten Graphen ist die Adjazenzmatrix symmetrisch: 1 4 2 5 falls {i,j}∈ E sonst. 1 , hier: aij := 0 , 3 1 2 3 4 5 1 2 3 4 5 Vorlesung Algorithmen (RN/MK) 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 WSI für Informatik, Universität Tübingen 150 75 Platzbedarf: O(n2) ist günstig, falls m := E ≈ n 2 . Aber: Oft sind Graphen dünn, d.h. m ≈ O (n ) . Bsp.: Zahl der Kanten in Bäumen mit n Knoten ist n – 1. Planare Graphen: Graph heißt planar, falls er in Ebene gezeichnet werden kann, ohne dass sich Kanten überkreuzen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 151 Zwei nicht-planare, ungerichtete Graphen: K5 K3,3 („vollständiger“ bipartiter Graph mit 3 und 3 Knoten) Mitteilung: Ein planarer Graph mit n Knoten enthält maximal 3n – 6 Kanten. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 152 76 2. Darstellung: Adjanzenzlisten Speichere für jeden Knoten v seine „Nachbarn“: G = (V, E) gerichtet: InAdj(v ) = { w ∈ V (w, v ) ∈ E} OutAdj(v ) = { w ∈ V (v, w) ∈ E} G ungerichtet: Adj(v ) = { w ∈ V Vorlesung Algorithmen (RN/MK) {v,w}∈ E} WSI für Informatik, Universität Tübingen 153 Im vorigen Beispiel (gerichtet): InAdj: 1 2 3 4 5 2 OutAdj: 5 1 2 1 2 3 4 5 5 1 5 3 Platzbedarf: O(n + m) Nachteil: Zugriffszeit auf Kante abhängig von Listenlänge, d.h. Knotengrad: Eingangsgrad indeg(v) eines Knoten v = { (w, v ) (w, v ) ∈ E } , Ausgangsgrad outdeg(v) eines Knoten v = { (v, w) (v, w) ∈ E} , analog für ungerichtete Graphen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 154 77 Graph G = (V, E) heißt Baum, falls a) V enthält genau einen Knoten v0 mit indeg(v0) = 0. b) ∀ v ∈ V \ {v0 }: indeg(v ) = 1 c) G ist azyklisch. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 155 6.2 Topologisches Sortieren Sei G = (V, E) gerichteter Graph. Abbildung num: V {1, ..., n} mit n = |V| heißt topologische Sortierung von G, falls num(v) < num(w) für alle (v, w) ∈ E . Bsp.: 1 4 2 5 2 1 5 3 4 3 1 2 Vorlesung Algorithmen (RN/MK) 3 es gibt keine topologische Sortierung! WSI für Informatik, Universität Tübingen 156 78 Lemma: Gerichteter Graph G = (V, E) besitzt genau dann eine topologische Sortierung, wenn G azyklisch ist. Beweis: "⇒" : Sei G zyklisch. Dann ist etwa (v0, ..., vk), k ≥ 1, ein Kreis. Für eine topologische Sortierung muß aber gelten: num(v0) < num(v1) < ... < num(vk) = num(v0). Widerspruch!! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 157 "⇐" : Sei G azyklisch. Beh.: G enthält Knoten v mit indeg(v) = 0. Wir finden solchen Knoten v wie folgt. Starte mit bel. Knoten w und gehe entlang eingehender Kanten „rückwärts“. Da Graph azyklisch und endlich, wird kein Knoten auf diesem „Rückweg“ zweimal besucht und daher terminiert dieser Prozess mit einem Knoten v mit indeg(v) = 0. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 158 79 Jetzt zur topologischen Sortierung: Beweis per Induktion über Knotenzahl: |V| = 1: trivial. |V| > 1: Wähle (gemäß Beh.) v mit indeg(v) = 0. Entferne v und sortiere den Restgraph G´ topologisch induktiv, d.h.: Sei num´ : V´ {1, ..., |V´|} top. Sortierung für G´. Dann ergibt sich für die top. Sort. num vermöge num´(w ) + 1, num(w) = 1, Vorlesung Algorithmen (RN/MK) falls w ≠ v falls w = v. WSI für Informatik, Universität Tübingen 159 Grundalgorithmus für topologisches Sortieren: count 0; while ∃ v ∈ V mit indeg(v) = 0 do count ++; num(v) count; streiche v und alle von v ausgehenden Kanten aus G; od if count < |V| then ausgabe(G zyklisch!) fi Komplexitätsanalyse: Problem: Test auf Existenz eines Knotens v mit indeg(v) = 0. Lösung: Merke alle Knoten mit indeg = 0 in Menge ZERO. Führe für jeden Knoten Buch über Anzahl jeweils einmündender Kanten. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 160 80 Algorithmus TOPSORT: (1) ZERO Ø; (2) for all v ∈ V do INDEG[v] 0 od; (3) for all e ∈ E do INDEG[target(e)] ++ od; (4) for all v ∈ V do (5) if INDEG[v] = 0 then ZERO ZERO ∪ {v} fi (6) od (7) count 0; Fortsetzung nächste Folie Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 161 (8) while ZERO ≠ Ø do (9) wähle und streiche v ∈ ZERO ; (10) count ++; (11) num[v] (12) count; for all (v, w ) ∈ E do (13) INDEG[w] – – ; (14) if INDEG[w] = 0 then ZERO (15) ZERO ∪ {v} fi od (16) od; (17) if count < |V| then ausgabe(G zyklisch!) fi Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 162 81 Satz: Topologische Sortierung eines gerichteten Graphen G = (V, E) kann in Zeit O(n + m) (Linearzeit!) berechnet werden. Hierbei: n = |V|, m = |E|. Beweis: Die Korrektheit folgt unmittelbar mit dem Lemma. Zur Komplexität: Übungsaufgabe! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 163 6.3 Billigste Wege Sei G = (V, E) gerichteter Graph mit Kostenfunktion c: E R, ein sogenanntes Netzwerk. Sei p = (v0, ..., vk) Pfad von v0 = v nach vk = w. Dann heißt k −1 c( p ) := ∑ c(vi , vi +1 ) i =0 Kosten des Pfades von v nach w. dist(v, w) = inf {c(p) | p ist Pfad von v nach w} heißt Entfernung. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 164 82 Beispiel: 2 –1 4 1 2 3 3 4 dist(1,2) = – 1 dist(3,1) = ∞ dist(3,4) = – ∞ , da Pfad (3,4,(5,6,4)i) Kosten 3 – i hat für alle i ≥ 0. negativer Zyklus 2 6 –6 5 3 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 165 3 grundsätzliche Problemstellungen: 1 single pair shortest paths (kürzeste Wege zwischen einem Knotenpaar) 2 single source shortest paths (kürzeste Wege von einem Knoten aus) 3 all pairs shortest paths (kürzeste Wege zwischen allen Knotenpaaren) Bemerkung: Unbekannt, ob 1 leichter/effizienter lösbar als 2 . Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 166 83 Single Source Shortest Paths Sei s der „Quellknoten“. G = (V, E). Gesucht für alle u ∈ V ∞, falls kein Pfad von s nach u in G, (u ) := dist (s, u ), sonst. Lemma: Sei u ∈ V . Dann gilt: i) (u ) = −∞ gdw. u ist erreichbar aus negativem Zyklus, der von s aus erreichbar ist. ii) (u ) ∈ R ⇒ ∃ billigster einfacher Pfad von s nach u mit Kosten δ (u ) . Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 167 Beweis: i) "⇐" : klar! "⇒" : Sei c := ∑ c(e ) und sei p ein kürzester Weg von e∈E s nach u mit c(p) < – c. Dann muss p Zyklus q enthalten, d.h. p ist nicht einfach. Wäre nun c(q ) ≥ 0, so könnten wir q aus p entfernen und so p verkürzen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 168 84 (u )∈ R, so gibt es Pfad von s nach u. Wir zeigen: (u ) = min{ c( p ) p ist Pfad von s nach u und p ist einfach }. ii) Falls Sei p* billigster einfacher Weg von s nach u. Ist Behauptung falsch, dann gibt es einen nichteinfachen Weg q von s nach u mit c(q) < c(p*). Durch Entfernen des Zyklus aus q entsteht kürzerer Weg q´ und da Zyklus (gemäß i) ) nicht negativ ist, folgt c(q´) < c(q) < c(p*), ein Widerspruch. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 169 1. Situation: Der geg. Graph G = (V, E) ist azyklisch. Bsp.: 2 2 3 5 2 5 s –1 3 2 6 4 1 (s ) = 0, (2) = 2, (3) = −1, (4) = inf {7,1} = 1, (5) = 2 + 3 = 5, (6 ) = inf {5 + 2, 7 + 1, 1 + 1} = 2 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 170 85 Nachfolgender Algorithmus setzt voraus, dass Graph topologisch sortiert ist, „also“ V = {1, 2, ... , n}. Algorithmus: d(s) 0; Pfad(s) s; (* Pfad als Liste repräsentiert *) for all v ∈ V \ {s} do d(v) ∞ od; for v = s + 1 to n do d(v) min {d(u) + c(u,v) | (u,v) ∈ E} (* u* sei hierbei ein optimaler u-Wert *) Pfad(v) Pfad(u*) ° v od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 171 Satz: Nach Ausführung von obigem Algorithmus gilt ∀v ∈ V 1) d (v ) = (v ) 2) d (v ) < ∞ ⇒ Pfad(v) ist billigster Weg von s nach v. 3) Algorithmus hat Laufzeit O( n + m), wobei n = |V| und m = |E|. Beweis: Korrektheit ( 1) + 2) ): Induktion über v v < s: v = s: (v ) = ∞, da v von s aus nicht erreichbar. d (v ) = ∞, da nach Init. nicht mehr verändert (v ) = d (v ) = 0. Pfad(s) = s ist einziger Weg. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 172 86 v > s: Sei In (v ) := { u ∈ V (u , v ) ∈ E }. Nach Ind´vor. gilt für u ∈ In(v ) schon d (u ) = (u ) und Pfad(u) ist berechnet. Ist In (v ) = Ø, dann d (v ) = (v ) = ∞. Ist In (v ) ≠ Ø, so wähle u* mit d (u *) + c(u*, v ) minimal. Falls d(u*) = ∞ , so auch d (v ) = (v ) = ∞. Sonst ergibt sich billigster Weg nach v durch Konkatenation und (v ) = (u *) + c(u*, v ) = (v ). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 173 Laufzeit: Topologisches Sortieren kostet Zeit O( n + m ). Initialisierung: O(n) „Hauptteil“: Komplexität wird i.w. bestimmt durch ∑ In(v ) = m, v∈V also O( n + m ). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 174 87 2.Situation: Alle Kantenkosten nichtnegativ (d.h. ∀e ∈ E , c(e) ≥ 0 ), Zykel erlaubt Dijkstras Algorithmus: Nachfolgend nur Kosten kürzester Pfad berechnet; eigentliche Pfadberechnung analog vorher. Idee: Für Menge S von Knoten mit bereits bestimmtem kürzesten Pfad muss es Knoten x ∈ V \ S geben, sodass kürzester Weg von s nach x über die Knoten in S geht und dann noch eine Kante aus S nach x. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 175 Genauer: x ist Knoten, der, für alle u ∈ S , den Ausdruck (u ) + c(u, x ) minimiert. Nachfolgend: S := Menge der Knoten u mit bekanntem (u ). S ′ := Menge der Knoten aus V \ S , die Nachbarn in S haben Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 176 88 Algorithmus: S ← {s}; d (s ) ← 0; S ′ ← OutAdj(s ); for all u ∈ S ′ do; d ′(u ) ← c(s, u ); for all u ∈ V − (S ∪ S ′) do d ′(u ) ← ∞; Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 177 while S ′ ≠ o/ do x ← derjenige Knoten aus S ′ mit minimalem d ′ - Wert; d ( x ) ← d ′( x ); S ← S ∪ {x}; S ′ ← S ′ \ {x}; for all u ∈ OutAdj( x ) do if u ∉ S then S ′ ← S ′ ∪ {u}; d ′(u ) ← min{d ′(u ), d ( x ) + c( x, u )} fi od od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 178 89 Beispiel (Ungerichteter Graph): 3 1 1 2 2 0 Vorlesung Algorithmen (RN/MK) 4 3 3 1 5 1 2 5 WSI für Informatik, Universität Tübingen 179 Lemma: Sei x ∈ S ′ so gewählt, dass d ′( x ) minimal ist. Dann gilt d ′( x ) = ( x ). Beweis: Sei p ein billigster Weg von s nach x derart, dass alle Knoten (bis auf x) in S liegen. Angenommen, es gäbe einen billigeren Weg q von s nach x. q muss einen ersten Knoten v in V \ S haben und nach Wahl von x ist d ′(v ) ≥ d ′( x ). Da alle Kanten nichtnegativ sind, gilt aber c(q ) ≥ d ′(v ) ≥ d ′( x ) = d ( x ) = c( p ), ein Widerspruch. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 180 90 Zur Laufzeit: Implementiere S und S ′ als Bitvektoren und d und d ′ als Arrays. •Aufwand für „ for all u ∈ OutAdj( x ) “: ∑ OutAdj( x ) = O(m + n ). x∈V •n-maliges Minimieren über S ′ : O(n² ). Insgesamt ergibt sich Laufzeit O(n²+m), für dichte Graphen (m ≈ n ² ) ausreichend. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 181 Alternativ: Speichere S ′ in Heap (balancierter Baum), gemäß d ′-Werten geordnet. Damit Laufzeit O((m+n)log n), da nun Einfügen und Löschen in S ′ je O(log n ) Zeit kostet. Für dünne Graphen ist dies eine Verbesserung. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 182 91 Satz: Mit Hilfe des Algorithmus von Dijkstra läßt sich das Single Source Shortest Path Problem in Laufzeiten O(n ² ) bzw. O((m + n ) log n ) lösen. Mitteilung: Mit Hilfe sogenannter Fibonacci-Heaps läßt sich die Laufzeit des Algorithmus von Dijkstra asymptotisch zu O(n log n + m) verbessern. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 183 3.Situation: Negative Kantenkosten erlaubt, aber keine negativen Zykel. Bellman-Ford-Algorithmus Das „Entspannen einer Kante (v,w)“ bezeichnen wir mit Relax ((v,w)): d (w) ← min{d (w), d (v ) + c(v, w)} Offensichtlich: Entspannen einer Kante erhöht keinen d-Wert Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 184 92 Lemma: Falls für alle u ∈ V vor dem Entspannen einer beliebigen Kante (v,w) gilt, dass d (u ) ≥ (u ), dann gilt dies auch hinterher. Beweis: Jeder Weg von s nach v zusammen mit Kante (v,w) ergibt Weg von s nach w. Deshalb (v ) + c(v, w) ≥ (w). Weiterhin : (v ) + c(v,w) ≤ d (v ) + c(v,w) ⇒ (w) ≤ d (v ) + c(v, w) ⇒ (w) ≤ d (w) falls (v,w) „echt“ relaxiert. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 185 Algorithmus: d (s ) ← 0; for all v ≠ s do d (v ) ← ∞ while „möglich“ do Entspanne Kanten od Beobachtung: d(u) wird immer kleiner, unterschreitet aber nie Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen (u ) . 186 93 Offen bleibt noch die Frage nach der „Entspannungs-Reihenfolge“, sodass d schnell gegen konvergiert. Lemma: Sei w ∈ V und sei (w) < ∞ und sei (v, w) die letzte Kante auf billigstem Weg von s nach w. Dann gilt: Falls (v,w) entspannt wird, nachdem d (v ) = worden ist, so ist danach d (w) = (w). (v ) ge- Beweis: Übung! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 187 Algorithmus: d (s ) ← 0; for all v ≠ s do d (v ) ← ∞; for i ← 1 to n − 1 do for all (v, w) ∈ E do Relax ((v, w)); Lemma: Für i=0,...,n-1 gilt: Nach dem i-ten Durchlauf der for-Schleife ist d (w) = (w) für alle w ∈V , für die es einen billigsten Pfad der Länge i von s nach w gibt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 188 94 Beweis: Induktion über i: i = 0 : d (s ) = (s ), da es keine negativen Zykel gibt. i → i +1: Sei w der Knoten mit billigstem Weg von s nach w der Länge i+1 und sei (v,w) die letzte Kante auf diesem Weg. Also gibt es billigsten Weg von s nach v der Länge i und nach Induktionsannahme ist nach dem i-ten Durchlauf der for-Schleife d (v ) = (v ) . Im (i+1)-ten Durchlauf wird insbesondere (v,w) entspannt: ⇒ d (w) = d (v ) + c((v, w)) = (v ) + c((v, w)) = (w) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 189 Korollar: Nach dem (n-1)-ten Schleifendurchlauf gilt für alle v aus V, dass d (v ) = (v ). Beweis: Nach obigem Lemma und der Annahme der Nichtexistenz negativer Zykel folgt, dass alle billigsten Wege Länge höchstens n-1 haben. Insgesamt: Satz: In Laufzeit O(n ⋅ m ) läßt sich das Single Source Shortest Path Problem lösen, falls der Graph keine negativen Zykel enthält. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 190 95 4.Situation: Auch negative Zykel erlaubt. Algorithmus: 1 Führe zuerst die n-1 for-Schleifendurchläufe des Algorithmus von Bellman-Ford aus und merke in d1 die so erzielten d-Werte. 2 Führe n weitere for-Schleifendurchläufe aus und speichere das Ergebnis in d2. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 191 Lemma: Für w ∈ V gilt : i) d 2 (w) = d1 (w) ⇒ (w ) = d1 (w) ii) d 2 (w) < d1 (w) ⇒ (w ) = −∞ Beweis: Übung! Bemerkung: Wenn sich nach nur einem weiteren Durchlauf der for-Schleife nach Abschluss von 1 noch etwas ändert, so gibt es einen negativen Zykel, sonst aber nicht. Um aber alle Zykel entdecken zu können, benötigt man in 2 insgesamt n Durchläufe. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 192 96 All Pairs Shortest Paths Annahme: Keine negativen Zykel. V = {1,2,..., n} Für i, j ∈ V und 0 ≤ k ≤ n definiere k (i, j ) := Kosten des billigsten Weges von i nach j, dessen innere Knoten ≤ k sind. Beispiel: (1,4 ) = ∞ 1 (1,4 ) = ∞ 2 (1,4 ) = 6 3 (1, 4 ) = 1 4 (1,4 ) = 1 2 2 1 -3 Vorlesung Algorithmen (RN/MK) 4 5 3 WSI für Informatik, Universität Tübingen 193 c(i, j ), falls (i, j ) ∈ E. , falls i = j. 0 (i, j ) = 0 ∞ , sonst. Also: n 2 4 0 (i, j ) = (i, j ) = Kosten des billigsten Weges von i nach j. Frage: Wie berechnet sich k aus 2 Möglichkeiten: k-1 Also gilt: k (i, j ) (i, k ) (i, j ) = min{ Vorlesung Algorithmen (RN/MK) ? Entweder k Teil eines billigeren Weges oder nicht: k-1 i k-1 k −1 j (k , j ) k k-1 (i, j ), k −1 (i, k ) + k −1 (k , j )} WSI für Informatik, Universität Tübingen 194 97 Algorithmus: for all i, j ∈ V do 0 c(i, j ), falls (i, j ) ∈ E (i, j ) ← 0 , falls i = j ∞ , sonst ; for k = 1 to n do for all i = 1 to n do for all j = 1 to n do (i, j ) ← min{ k k −1 (i, j ), (i, k ) + k −1 k −1 (k , j )} od od od Laufzeit: O(n³) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 195 Alternativer Algorithmus: Benutze Algorithmus von Dijkstra bzw. Bellman-Ford Idee: Führe n-mal für alle möglichen Startknoten Bellman-FordAlgorithmus aus. Laufzeit : O(n ⋅ nm ) Beobachtung: Es reicht sogar, einmal Bellman-Ford und (n-1)-mal Dijkstra auszuführen. Laufzeit : O(n ⋅ (n + m ) log n ) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 196 98 6.4 Depth First Search (Tiefensuche) Durchmusterung von Graphen. Wichtige Eigenschaften: Mit DFS Graph systematisch von einem Knoten s aus zu durchmustern, dabei immer zuerst „in die Tiefe“. Beispiel: s Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 197 Rekursion: procedure DFS (s) besucht [s] true; drucke (s); for all (s, v ) ∈ E do if not besucht [v] then DFS(v) fi; od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 198 99 DFS teilt die Kanten des Graphen in vier Klassen ein, je nach Art des Besuchs: Wir betrachten gerade die gerichtete Kante (v,w): 1. (v,w) gehört zu Baumkanten T, falls w noch nicht besucht. 2. (v,w) gehört zu Vorwärtskanten F, falls w schon besucht *T w “, d.h. ∃ Pfad von v nach w bestehend aus und „v → lauter Baumkanten. 3. (v,w) gehört zu Rückwärtskanten B, falls w schon besucht *T v. → und w 4. (v,w) gehört zu Querkanten C, falls w schon besucht, aber *T v. *T w noch w → weder v → Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 199 Erweiterung um dfsnum(v) und compnum(v): • dfsnum(v): Reihenfolge der rekursiven DFS-Aufrufe. • compnum(v): Abschlussreihenfolge der DFS-Aufrufe. Hauptprogramm: false od; for all v ∈ V do besucht[v] z1 z2 0; (* T ← B ← F ← C ← o/ ;*) for all v ∈ V do if not besucht[v] then DFS(v) fi od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 200 10 0 Für die Implementierung brauchen wir 2 Zähler z1, z2: (1) procedure DFS(v) (2) besucht [v] true; z1 z1+1 (3) dfsnum [v] z1; (4) for all (v, w) ∈ E do (5) if not besucht [w] then DFS(w) (* T ← T ∪ {(v, w)}*) (6) (* *T w then F ← F ∪ {(v, w)} (7) else if v → *T v then B ← B ∪ {(v, w)} → (8) else if w (9) else C ← C ∪ {(v, w)} (10) fi (11) fi (12) *)fi (13) od (14) z 2 ← z 2 + 1; (15) compnum[v] z2 Vorlesung Algorithmen (RN/MK) Beispiel: WSI für Informatik, Universität Tübingen i 9 201 d 4 b 2 f 6 s a 1 c 3 e 5 g 7 h 8 Laufzeit: da O(n+m) a) Einzellaufzeit eines Aufrufs (ohne Rekursion) ist O(1+outdeg(v)) b) für jeden Knoten einmal DFS-Aufruf ⇒ O ∑ (1 + out deg(v )) = O(n + m ). v∈V Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 202 10 1 Lemma (Eigenschaften, Teil 1): a) Kantenklassen T,B,F,C bilden Partition der Kantenmenge E b) T entspricht dem Wald der rekursiven Aufrufe *T w gdw. dfsnum[v ] ≤ dfsnum[w] und c) v → compnum[w] ≤ compnum[v ]. * z) , *T w, (w, z ) ∈ E und ¬ (v d) Seien v, w, z ∈ V mit v → → T dann i) dfsnum[z ] < dfsnum[v] ii) (w, z ) ∈ B ∪ C iii) compnum[z ] > compnum[v ] gdw. (w, z ) ∈ B. iv) compnum[z ] < compnum[v ] gdw. (w,z ) ∈ C. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 203 Beweis: a), b) klar: direkt aus Algorithmus. *T w ⇔ Aufruf DFS(w) geschachtelt in DFS(v) → c) v ⇔ dfsnum[v] ≤ dfsnum[w] und compnum[v ] ≥ compnum[w]. d) *T w ⇒ dfsnum[v ] ≤ dfsnum[w] v → (w, z ) ∈ E ⇒ DFS( z ) wird aufgerufen, bevor DFS(w) endet, und auch bevor DFS(v) endet. *T z ) ⇔ DFS( z ) nicht in DFS(v) geschachtelt ¬(v → ⇒ DFS( z ) startet vor Aufruf DFS(v ). ⇒ dfsnum[z ] < dfsnum[v] (i) e) ( Teil 2 ) → (w, z ) ∈ B ∪ C (ii) *T w nach Definition von B (w, z ) ∈ B ⇔ z → * v da v *T w und ¬(v *T z ) → → ⇔z → T ⇔ compnum[z ] > compnum[v ] (iii) (ii), (iii) (iv) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 204 10 2 Lemma (Eigenschaften, Teil 2): Sei (v, w) ∈ E : e) (v, w) ∈ T ∪ F ⇔ dfsnum[v ] ≤ dfsnum[w]. f) (v, w) ∈ B ⇔ dfsnum[w] < dfsnum[v ] und compnum[w] > compnum[v ]. g) (v, w) ∈ C ⇔ dfsnum[w] < dfsnum[v ] und compnum[w] < compnum[v ]. Vorlesung Algorithmen (RN/MK) Beweis: e) WSI für Informatik, Universität Tübingen 205 *T w ⇒ dfsnum[v ] ≤ dfsnum[w] (v, w) ∈ T ∪ F ⇒ v → Sei dfsnum[v ] ≤ dfsnum[w]. Da (v, w) ∈ E , muss DFS(w) vor Abschluss von DFS(v ) aufgerufen werden. ⇒ echte* Schachtelung v → w T ⇒ ⇒ (v, w) ∈ T ∪ F f), g) folgen aus d) und e) ... Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 206 10 3 Bemerkungen: •T, B, F, C werden im wesentlichen durch dfsnum, compnum festgelegt (vgl. Lemma!) •In azyklischen Graphen gibt es keine Rückwärtskanten, d.h. ∀(v, w) ∈ E : compnum[v ] > compnum[w] ⇒ Nummerierung num(v ) := n + 1 − compnum[v] ergibt topologische Sortierung. Mitteilung: Zusammenhangskomponenten in ungerichteten Graphen können mit Hilfe von DFS in Zeit O(n+m) berechnet werden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 207 Starke Zusammenhangskomponenten Ein gerichteter Graph G=(V,E) heißt stark zusammen* w. → hängend gdw. ∀v, w ∈ V : v E Die maximalen (bzgl. Mengeninklusion) stark zusammenhängenden Teilgraphen von G heißen starke Zusammenhangskomponenten (SZK‘s). Beispiel: a c b K3 d K1 h K4 e K2 Vorlesung Algorithmen (RN/MK) f g WSI für Informatik, Universität Tübingen 208 10 4 Idee für Algorithmus: Erweitere DFS: Sei G′ = (V ′, E ′) bisher erforschter Teilgraph von G. Verwalte die SZK’s von G : Starte mit V ′ = {a}, E ′ = o/ , SZK = {{a}}. Sei (v,w) die nächste Kante in DFS. Dann ist v ∈ V ′. Ist w ∉ V ′, d.h. (v, w) ∈ T , dann erweitere SZK um {w}. Ist w ∈ V ′, dann füge mehrere SZK' s zu einer zusammen (falls (v, w) ∈ B ∪ C ) Aber wie zusammenfügen? Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 209 Bezeichnungen: •SZK K heißt abgeschlossen, wenn alle DFS-Aufrufe für Knoten in K abgeschlossen sind. •Wurzel von K ist der Knoten mit kleinster dfsnum in K. •Folge von Knoten heißt unfertig, falls ihre DFS aufgerufen sind, aber ihre SZK noch nicht abgeschlossen ist. (Sortiert nach dfsnum!) •wurzeln ist Folge der Wurzeln von noch nicht abgeschlossenen SZK´s. (Sortiert nach dfsnum!) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 210 10 5 Beispiel: a c b d h e f unfertig: wurzeln: a a bc b e e g f f g g Beobachtung: *E g → 1. ∀v ∈ unfertig : v 2. ∃/(v, w) ∈ E : v in abgeschlossener und w in nichtabgeschlossener Komponente. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 211 Von g ausgehende Kanten: ( g , d ) ∈ C : tut nichts, d liegt in abgeschlossener SZK. ( g , b ) ∈ B : vereinigt vier Komponenten {b, c}, {e}, { f }, {g}. unfertig: wurzeln: a a bcefg b ( g , h ) ∈ T : erzeuge neue Komponente {h} Beim Abschluss von DFS(v) teste, ob v Wurzel. Wenn ja, so gib Komponente mit v als Wurzel aus und streiche sie aus unfertig und v aus wurzeln. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 212 10 6 Operationen auf unfertig und wurzeln erlauben Implementierung als Keller (Stack): z.B. Vereinigen von Komponenten: K1 unfertig K2 w K3 K4 v wurzeln K2, K3 und K4 werden vereinigt durch pop(wurzeln) bis top(wurzeln) = Wurzel der SZK von w. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 213 Korrektheit: Invarianten: I1: ∃/(v, w) ∈ E mit v in abgeschlossener und w in nichtabgeschlossener SZK. I2: Nichtabgeschlossene SZK´s liegen auf einem Pfad, insbesondere ihre Wurzeln liegen auf einem Baumpfad I3: Knoten jeder nichtabgeschlossenen Komponente Ki bilden Intervall in „unfertig“, erstes Element des Intervalls ist die Wurzel von Ki. Zu zeigen: Invarianten bleiben beim Einfügen neuer Kanten (v, w) ∈ E erfüllt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 214 10 7 1.Fall: (v, w) ∈ T : push (w, unfertig); push (w, wurzeln) I1: Es wird keine SZK abgeschlossen. I2: Sei r Wurzel der Komponente von v. *T v und (v, w) ∈ T Dann r → *T w ⇒ r → I3: Trivial! Vorlesung Algorithmen (RN/MK) 2.Fall: (v, w) ∈/ T : a) b) WSI für Informatik, Universität Tübingen 215 w in abgeschlossener SZK: Tue nichts. w in nichtabgeschlossener SZK: Vereinige oberste SZK´s bis zu der, in der w liegt. In a) passiert nichts. Nur b) zu betrachten: I1: Es wird keine SZK abgeschlossen... I2: Pfad wird verkürzt. I3: Löschen der obersten Wurzel vereinigt Intervalle zu einem neuen. Da vorher I2 galt, bildet dieses eine Intervall eine einzige Komponente. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 216 10 8 Vermöge nachfolgendem Algorithmus (Programm) erhalten wir: Satz: Starke Zusammenhangskomponenten eines gerichteten Graphen können in Zeit O(n+m) berechnet werden. Das Hauptprogramm wird erweitert um: unfertig wurzeln leerer Keller Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 217 (1) procedure DFS(v) (2) besucht[v] true; z1 z1+1; dfsnum[v] z1; (3) push(v, unfertig); push(v, wurzeln); (4) for all (v, w ) ∈ E do (5) if not besucht[w] then DFS(w) (6) else if w ∈ unfertig (7) then while dfsnum[top(wurzeln )] > dfsnum[w] do (8) pop(wurzeln) od ; (9) fi (10) fi (11) od (12) z2 z2+1; compnum[v] z2 (13) if v = top(wurzeln) (14) then repeat w pop(unfertig) (15) print(w) (16) until v = w ; (17) pop(wurzeln) ; (18) fi Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 218 10 9 Zeilen (13)-(16) : Ausgabe der SZK mit Wurzel v. Bemerkungen: • Test „w ∈ unfertig“ wird mit zusätzlichem boole‘schem Feld in_unfertig unterstützt. • Jeder Knoten wird höchstens einmal nach unfertig bzw. wurzeln aufgenommen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 219 6.5 Minimal aufspannende Bäume (MST) Sei G(V,E) ein zusammenhängender, ungerichteter Graph. Sei c:E → R+ eine Kostenfunktion. Ziel: Berechne ET ⊆ E, sodass G(V,ET) zusammenhängend ist und c( ET ) := ∑ c(e ) kleinstmöglich ist. e∈ET Beispiel: 10 3 1 4 2 3 2 6 2 8 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 220 11 0 Anwendungsbeispiele: • Computer-Netzwerke... • Elektronische Schaltkreise... • Netz von Telefonanschlüssen... uvm. Lemma: G(V,ET) ist azyklisch. Beweis: Würde G(V,ET) einen Kreis enthalten, so könnte man eine Kante entfernen, der Graph wäre weiterhin zusammenhängend und die Gesamtkosten geringer. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 221 Wir suchen also einen „aufspannenden Baum“ mit minimalen Kosten (MST, Minimum Spanning Tree). Kruskals Greedy-Algorithmus für MST Sortiere Kanten e1, e2, ... , em so, dass c(e1 ) ≤ c(e2 ) ≤ ... ≤ c(em ); ET ← o/ ; for i ← 1 to m do if (V , ET ∪ {ei }) azyklisch then ET ← ET ∪ {ei } fi od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 222 11 1 Satz: Der Greedy-Algorithmus von Kruskal ist korrekt, d.h. er findet immer einen MST. Beweis: Eine Kantenmenge E ′ ⊆ E heiße „gut“, falls sie zu einem MST erweiterbar ist. Behauptung: Sei E ′ ⊆ E gut und sei e ∈ E \ E ′ eine billigste Kante, sodass der Graph (V , E ′ ∪ {e}) azyklisch ist. Dann ist auch E ′ ∪ {e} gut. Beweis der Behauptung per Induktion: Sei T1 = (V , E1 ) ein MST mit E ′ ⊆ E1 (T1 existiert, da E ′ gut ). Ist e ∈ E1 , so fertig. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 223 Ist e ∉ E1, so betrachte Graph H = (V , E1 ∪ {e}). H enthält einen Kreis, auf dem e liegt. Da (V , E ′ ∪ {e}) azyklisch ist, enthält dieser Kreis auch eine Kante aus E1 \ ( E ′ ∪ {e}). Sei eine solche Kante e1. Betrachte T2 = (V , ( E1 \ {e1}) ∪ {e}). T2 ist aufspannend und c(T2 ) = c(T1 ) + c(e ) − c(e1 ). Da e eine billigste Kante war, gilt c(e ) ≤ c(e1 ). Also c(T2 ) ≤ c(T1 ). Da nach Voraussetzung T1 ein MST ist, gilt c(T2 ) = c(T1 ). D.h. T2 auch ein MST, also E ′ ∪ {e} gut. Mit der Behauptung folgt die Korrektheit von Kruskals Algorithmus unmittelbar. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 224 11 2 Beispielbild: T1 : E1 e1 e T2 : ( E1 \ {e1}) ∪ {e} Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 225 Zur Implementierung: Wir halten uns eine Partition V1 ∪ V2 ∪ ... ∪ Vk = V von V : ∀i ≠ j : Vi ∩ V j = o/ und ∀i : Vi ≠ o/ . Operationen: Starten mit Partition {{1}, {2}, ... , {n}}. Benötigen: •Find(x): •Union(a,b): Vorlesung Algorithmen (RN/MK) Gibt Namen der Menge zurück, die x enthält. Vereinigt die Mengen a und b. WSI für Informatik, Universität Tübingen 226 11 3 Damit wir d die for-Schleife in Kruskals Algorithmus zu: for i ← 1 to m do sei ei = {u , v}; a ← Find (u ); b ← Find(v ); if a ≠ b then ET ← ET ∪ {ei }; Union(a,b) fi od Bemerkung: Auf diese Weise lassen sich i.w. auch die Zusammenhangskomponenten eines Graphen berechnen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 227 Zur Realisierung der Union-Find-Datenstruktur: Erste naheliegende Idee: Realisierung als Feld R[1 .. n], wobei R[x] Name der Menge sein soll, die x enthält. Damit: Find(x): return R[x] Union(a,b): for i ← 1 to n do if R[i ] = a then R[i ] ← b fi od Laufzeit: Find(x): Union(a,b): O(1) O(n) Algorithmus von Kruskal: 2m Find-Operationen und n-1 Union-Operationen. Laufzeit Kruskal: O(m+n²+m log m) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 228 11 4 Heuristische Ideen zur Verbesserung: •Union sollte nicht alle Elemente anschauen... Verwalte Elemente jeder Menge separat... •Behalte bei Union immer die Namen der größeren Mengen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 229 Also zusätzlich Verwaltung der Mengen als Listen (samt Größenangabe): Bild: Size Elem. 1 2 2 3 5 4 1 R: Vorlesung Algorithmen (RN/MK) wie vorher WSI für Informatik, Universität Tübingen 230 11 5 Damit folgende Implementierung: Initialisierung: Find(x): Union(a,b): for x ← 1 to n do R[x] ← x; Elem[x ] ← {x}; size[x ] ← 1; od return R[x] if size[a] < size[b] then „vertausche“ a und b fi; for all x ∈ Elem[b] do R[ x ] ← a ; insert(x, Elem[a]) od; size[a ] ← size[a ] + size[b] Beachte: Im Worst Case kann ein Union aber dennoch Zeit O(n) benötigen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 231 Satz: Mit obiger Implementierung lassen sich die Initialisierungen sowie n-1 Union-Operationen und m Find-Operationen in Laufzeit O(n ⋅ log n + m ) realisieren. Beweis: Initialisierungen: O(n), klar! m Find-Operationen: O(m), klar! n Union-Operationen kosten Zeit O(n log n): Union(a,b): Vereinige zwei Mengen mit na bzw. nb Elementen; o.E. sei nb ≤ na ⇒ Laufzeit O(1 + nb ). Sei ni für i-tes Union die Größe der kleineren Menge. Damit n −1 Zeit für alle Union-Operationen: n −1 O ∑ (ni + 1) = O n + ∑ ni . i =1 i =1 Immer wenn ein Element die Menge wechselt, trägt es n −1 genau 1 zu ∑ ni bei. i =1 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 232 11 6 n −1 n i =1 j =1 Also ∑ ni = ∑ r j , wobei r j angibt, wie oft Element j die Menge wechselt. Behauptung: rj ≤ log 2 n für alle j = 1, 2, ... , n. Beweis der Behauptung: Wenn j die Menge wechselt und vorher in einer Menge mit l Elementen war, so ist j nachher in einer Menge mit mindestens 2l Elementen. D.h. nach dem k-ten Wechsel ist j in einer Menge mit ≥ 2 k Elementen. Da es nur n Elemente gibt, folgt k ≤ log 2 n. Mit Hilfe der Behauptung folgt somit, dass n Union-Operationen Zeit O(n log n) kosten. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 233 Korollar: Der Algorithmus von Kruskal hat Laufzeit O(m ⋅ log m ) . Bemerkung: Obiges ist ein Beispiel für amortisierte Analyse: Wir betrachten statt Einzeloperationen, welche verschieden teuer sind, eine Folge von Operationen und stellen fest, wieviel diese zusammen kosten. Anderes Beispiel für amortisierte Analyse: Binärzähler: Vorlesung Algorithmen (RN/MK) Nicht trivial n log n, sondern 2n amortisiert... WSI für Informatik, Universität Tübingen 234 11 7 Alternative zur vorigen Implementierung: Idee: Repräsentiere jede Menge durch einen Baum (i.a. nicht binär): Jeder Knoten (außer Wurzel) zeigt auf Elternknoten, Wurzel enthält Namen der Menge. R[x] x Damit: Union(a,b): „Zusammenhängen“ von Bäumen. a b Zeit: O(1) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 235 Find(x): Folge dem Pfad von x zur Wurzel. Zeit: O(1+Tiefe(x)). Ideal wäre also Baumtiefe 1... Im Worst Case können n Union-Operationen aber zu Tiefe n-1 führen. Deshalb: „Gewichtete Vereinigungsregel“: Hänge immer den kleineren an den größeren Baum (Baumgröße = Anzahl der Knoten). Weitere Idee: Pfadkomprimierung Wenn bei Find der Pfad zur Wurzel zurückverfolgt wird, so hänge alle Zeiger des Pfades zur Wurzel hin um: Bild: x Vorlesung Algorithmen (RN/MK) x WSI für Informatik, Universität Tübingen 236 11 8 Mitteilung: Mit gewichteter Verzweigungsregel und Pfadkomprimierung lassen sich die Initialisierungen sowie n-1 Union-Operationen und m Find-Operationen in Laufzeit O(n + m ⋅ (m + n,n )) realisieren, wobei die Inverse der Ackermannfunktion ist. wächst extrem langsam und ist für alle realistischen Werte ≤ 5. Der Beweis obiger Mitteilung ist ziemlich kompliziert. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 237 7. Mustersuche in Zeichenketten Zeichenkette (String) T ist endliche Folge von Symbolen aus endlichem Alphabet Σ . Besteht T aus n Symbolen, so werden diese in T[1], T[2], ..., T[n] gespeichert. T[i..j], 1 ≤ i ≤ j ≤ n ist das an der Position i beginnende und an der Position j endende Teilwort von T. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 238 11 9 Grundlegendes Problem: Gegeben: Zwei Zeichenketten P[1..m] und T[1..n] mit m ≤ n. Frage: Kommt P als Teilwort in T vor? Naiver Algorithmus: for i = 1 to n – m + 1 do überprüfe, ob P = T[i..i+m–1] od Laufzeit im Worst Case O(m·n). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 239 7.1 Der Algorithmus von Knuth-Morris-Pratt Naiver Algorithmus verschwendet gewissermaßen Information: Merkt sich nicht, welche Zeichen in T bereits mit Anfangsstück von P übereingestimmt haben, bis „Mismatch“ auftrat: Vergleichszeiger Situation: (naiverAlg.) T ··· P a b a a b a a b a b a a a ··· Mismatch Nächster Schleifendurchlauf: Verschiebung des Vergleichsfensters um eins nach rechts: T P ··· a b a a b a a a b a b a a Vorlesung Algorithmen (RN/MK) wurde zurückgesetzt b ··· WSI für Informatik, Universität Tübingen 240 12 0 Im Gegensatz dazu speichert der Alg. von KMP besagte Information – einerseits, um Verschiebung der Muster nach rechts zu vergrößern und andererseits, um Vergleichszeiger nicht „zurückzusetzen“. Die Präfixfunktion eines Musters Zentral für den KMP-Algorithmus: Angenommen, P[1..q] = T[s+1..s+q], q < m. Was ist das kleinste s´ > s, sodass P[1..k] = T[s´+1..s´+k], wobei s´+k = s+q ? Für solches s´ stimmen die ersten k Zeichen von P mit den entsprechenden Zeichen in T überein. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 241 Beispiel: T b a c b s=4 a b a b a a b a b a b a c a a b a Mismatch q=5 Hier: s´ = 6 c b a b a c a (s´= 5 (= s+1) führt notwendig sofort zu Mismatch!) Zur Beantwortung obiger Frage notwendige Information kann vorausberechnet werden, indem Muster P „mit sich selbst verglichen“ wird! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 242 12 1 Def.: Gegeben sei Muster P[1..m]. Dann Präfixfunktion π : {1, ... , m} {0, ... , m – 1} für P definiert vermöge (q ): = max {k 0≤ k < q P[1..k ] ist Suffix von P[1..q ] } d.h. ∃ P´∈ Σ q −k : P[1..q ] = P´o P[1..k ] Beispiel: P = a i= 1 π(i) = 0 b 2 0 a 3 1 b 4 2 z.B. Berechnung von P[4]: P[1..q] = a b a b Test k = 3: P[1..3] = a b a Test k = 2: P[1..2] = a b Vorlesung Algorithmen (RN/MK) a 5 3 b 6 4 a 7 5 b 8 6 c 9 0 a 10 1 kein Suffix! Suffix! WSI für Informatik, Universität Tübingen 243 KMP-Matcher(T, P) (1) n Länge von T; m Länge von P; (2) π Berechne_Präfixfunktion(P); (3) q 0; (4) for i 1 to n do (5) while q > 0 and P[q+1] ≠ T[i] do (6) q π[q] (7) od; (8) if P[q+1] = T[i] (9) then q q + 1; (10) fi (11) if q = m (12) then Ausgabe „Muster kommt ab Stelle i–m+1 vor“ (13) q π[q] (14) fi (15) od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 244 12 2 Berechne_Präfixfunktion(P) (1) m Länge von P; (2) π[1] 0; (3) k 0; 2 to m do (4) for q (5) while k > 0 and P[k+1] ≠ P[q] (6) do k π[k] (7) od; (8) if P[k+1] = P[q] (9) then k k+1 (10) fi; (11) π[q] k (12) od (13) return π Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 245 Zeitkomplexität: Laufzeit von Berechne_Präfixfunktion(P): Betrachte k. while-Schleife (5) - (7) nur ausgeführt, falls k > 0. Beginnen mit k = 0 (3) und in jedem Durchlauf der for-Schleife wird k um maximal 1 erhöht. Andererseits in jedem Durchlauf der while-Schleife k um mindestens 1 erniedrigt, denn π[k] < k ∀ k! D.h., „amortisiert“ betrachtet Kosten pro einem for-Schleifendurchlauf O(1). Damit Laufzeit von Berechne_Präfixfunktion(P) O(m). Gesamtlaufzeit von KMP-Matcher: O(m+n) O(m) für Berechne_Präfixfunktion(P) und O(n) für Rest: Analyse analog zu Berechne_Präfixfunktion(P) mit q anstelle von k ... Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 246 12 3 Korrektheit von Berechne_Präfixfunktion(P): Lemma 1: Sei π*(q) := {q, π(q), π(π(q)), ... }. Dann gilt für q = 1, 2, ..., m , dass π*(q) = { k | P[1..k] ist Suffix von P[1..q] }. Beweis: " ⊆" : i ∈ * (q ) ⇒ i = j (q ) für ein j. Beweis per Induktion über j: Ind´anfang: j = 0 ⇒ i = q und Beh. folgt, da P[1..q] Suffix von sich selbst ist. Ind´beh. folgt aus der Tatsache, dass P[1.. π(i)] Suffix von P[1..i] und der Transitivität der Suffixrelation. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 247 "⊇" : Widerspruchsbeweis: Ann.: ∃ j ∈ { k P[1..k ] ist Suffix von P[1..q ] } \ * (q ) . OE sei j maximal. Es muss j < q gelten, da q in beiden Mengen ist. Sei j´ kleinste Zahl in π*(q), die größer als j ist. P[1..j] ist Suffix von P[1..q] P[1..j´] ist Suffix von P[1..q] 1444442444443 ⇒ P[1..j] ist Suffix von P[1..j´] und j ist maximal unter Zahlen mit dieser Eigenschaft. ⇒ π(j´) = j und damit j ∈ π * (q ) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 248 12 4 Klar: Berechne_Präfixfunktion(P) korrekt für π(1) = 0 (siehe Zeile (2) ). Lemma 2: ∀ q = 1, 2 , ..., m: (q ) > 0 ⇒ (q ) − 1∈ * (q − 1) . Beweis: Falls k = π(q) > 0, so ist P[1..k] Suffix von P[1..q]. D.h. auch, dass P[1..k–1] Suffix von P[1..q–1] ist. Mit Lemma 1 folgt k − 1 ∈ * (q − 1) . Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 249 Definiere für q = 2, ... , m Eq −1 := { k k ∈ * (q − 1) und P[k + 1] = P[q ] } Lemma 3: ∀ q = 2 , ..., m: 0 , (q ) = 1 + max Vorlesung Algorithmen (RN/MK) falls Eq-1 = o/ {k ∈ E }, q −1 sonst . WSI für Informatik, Universität Tübingen 250 12 5 Beweis: (q > 0 ) : (q ), d.h. P[1..r ] ist Suffix von P[1..q ] und mit r ≥ 1 folgt P[r ] = P[q ]. Sei r = Lemma 2 ⇒ r = 1 + max{k ∈ * (q - 1) P[k + 1] = P[q ]} 1444442444443 =E q −1 Falls r = 0, so ex. kein k ∈ (q − 1) für welches P[1..k ] auf P[1..k + 1] ausgeweitet werden kann, sodass ein Suffix von P[1..q ] entsteht (sonst wäre (q) > 0). Also Eq −1 = o/ . * Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 251 Korrektheit von Berechne-Präfixfunktion (P) nun wie folgt: Zu Beginn der for-Schleife in Zeilen (4)-(12) gilt immer k = [q − 1] : Betreten der Schleife: Zeilen (2) und (3) Weitere Durchläufe: Zeile (11) Zeilen (5)-(10) passen k so an, dass es der korrekte Wert von [q ] wird: while-Schleife in Zeilen (5)-(7) sucht durch alle Werte mit k ∈ * [q − 1] bis einer gefunden wird mit P[k + 1] = P[q ] ; dann ist k maximaler Wert in Menge Eq −1 und dank Lemma 3 können wir [q ] den Wert k + 1 zuweisen. Falls kein solches k gefunden; sprich k=0, so wird [q ] auf 0 gesetzt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 252 12 6 Mitteilung: Mit wenig Mehraufwand und i.w. analog zur Korrektheit von Berechne_Präfixfunktion(P) folgt schließlich die Korrektheit von KMP Matcher(T,P). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 253 7.2 Der Algorithmus von Boyer-Moore Für Anwendungen in der Praxis ist meist der Algorithmus von Boyer-Moore (bzw. Variationen davon) erste Wahl. Er ist besonders vorteilhaft bei großen Alphabeten und relativ langen Mustern. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 254 12 7 Naiver Matcher (T , P, ∑ ) (1) n ← Länge von T ; m ← Länge von P; (2) (3) (4) s ← 0 (5) while s ≤ n − m do j ← m; (6) (7) while j > 0 and P[ j ] = T [s + j ] do (8) j ← j −1 (9) od (10) if j = 0 (11) then Ausgabe „Muster kommt ab Stelle s+1 vor“; (12) s ← s +1 (13) else s ← s + 1 (14) fi (15) od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 255 Boyer-Moore-Matcher (T , P, ∑ ) (1) n ← Länge von T ; m ← Länge von P; (2) ← Berechne_Letztes _Vorkommen ( P, m, ∑ ); (3) ← Berechne_Gutes_Suffix ( P, m ); (4) s ← 0 (5) while s ≤ n − m do j ← m; (6) (7) while j > 0 and P[ j ] = T [s + j ] do (8) j ← j −1 (9) od (10) if j = 0 (11) then Ausgabe „Muster kommt ab Stelle s+1 vor“; (12) s ← s + 1 s ← s + [0] (13) else s ← s + 1 s ← s + max( [ j ], j − [T [s + j ]]) (14) fi (15) od Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 256 12 8 Die wesentlichen Eigenschaften des Algorithmus von Boyer-Moore sind der Vergleich des Musters selbst gegen ein Textstück von rechts nach links und die Benutzung zweier, unabhängig voneinander arbeitender Heuristiken „schlechter Buchstabe“ und „gutes Suffix“. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 257 Die Heuristik „schlechter Buchstabe“ Angenommen, es kommt beim zeichenweisen Vergleich zum Mismatch P[ j ] ≠ T [s + j ] für ein j , 1 ≤ j ≤ m. Definiere max {i T [s + j ] = P[i ]}, falls T [s + j ] in P vorkommt. k := 1≤i≤ m 0 , sonst. Lemma: s kann gemäß der Heuristik „schlechter Buchstabe“ um j-k erhöht werden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 258 12 9 Beweis: Fall 1: k=0: D.h., T [s + j ] kommt nicht in P vor und so kann P gegenüber T oE um j nach rechts verschoben werden. Bild/Beispiel: T: 1 2 3 4 5 6 7 8 9 10 11 a b r d l a d a b r a a b j=2 a d a b a d s=3 P: Verschiebung um j=2: Extremfall: T = b n , P = a m ⇒ k = 0 und j = m in allen Fällen, also maximale Verschiebung möglich! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 259 Fall 2: k < j : D.h., T [s + j ] kommt in P links von der Stelle j vor und j − k > 0. Ohne Verlust kann um j − k verschoben werden. Bild/Beispiel: T: P: 1 2 3 4 5 6 7 8 9 10 11 a b r d l a d a b r a a d k=2 s=1 a l a d j=4 (=m) j-k=2 a l Verschiebung um j-k = 4-2 = 2 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 260 13 0 Fall 3: k >j: D.h. T[s+j] kommt in P rechts von der Stelle j vor und j-k < 0. Heuristik schlägt Verschiebung des Vergleichsfensters nach links vor, d.h. Verkleinerung von s. Boyer-Moore-Algorithmus umgeht diese Problematik dadurch, dass zweite Heuristik „gutes Suffix“ immer Verschiebung nach rechts vorschlägt und der BM-Algorithmus immer die maximale Verschiebung nach rechts wählt (vgl. auch Zeile (13) im Algorithmus). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 261 Bild/Beispiel: T: P: a b r a l l k=4 (=m) s=2 a l a j=3 d a b r a l Negative Verschiebung um j-k = -1: a l a l Sei [a ] die am weitesten rechte Position in P, an der a ∈ Σ in P vorkommt (also insbesondere a = P[ [a ]] ). Falls a nicht in P vorkommt, so setze [a ] := 0. heißt „Letztes_Vorkommen_Funktion“ und wird durch folgenden Algorithmus bestimmt: Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 262 13 1 Berechne_letztes_Vorkommen ( P, m, Σ ) : for „alle a ∈ Σ “ do [a ] ← 0; od; for j ← 1 to m do [P[ j ]] ← j; od; return Laufzeit: O( Σ + m ) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 263 Die Heuristik „gutes Suffix“: T: a b P: r a l a d a d b a d a b r a d a „gutes Suffix“ Verschiebung, bis ad wieder auftritt: 3 a d b Seien Q und R Zeichenketten: Q heißt ähnlich zu R (in Zeichen Q ~ R), falls Q Suffix von R oder R Suffix von Q ist. Heuristik „gutes Suffix“ besagt, dass wir, falls P[ j ] ≠ T [s + j ] (j < m), oE das Vergleichsfenster um [ j ] := m − 0max {k P[ j + 1..m] ~ P[1..k ]} ≤k <m nach rechts schieben können Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 264 13 2 ist die Gutes_Suffix_Funktion Zur Berechnung von : Beobachtung 1: [ j ] ≤ m − [m] Damit Umschreiben der Definition von [ j] = m − Vorlesung Algorithmen (RN/MK) [ j]: max {k P[ j + 1..m] ~ P[1..k ]} ( m )≤ k < m WSI für Informatik, Universität Tübingen 265 Beobachtung 2: Falls P[1..k ] Suffix von P[ j + 1..m] ist, dann ist es auch Suffix von P[1..m ] und deshalb k ≤ [m] gemäß Definition von . Damit weiteres Umschreiben der Definition von [ j] = m − max ( m )≤ k < m [ j] : ({ [m]} ∪ {k P[ j + 1..m] ist Suffix von P[1..k ]}) Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 266 13 3 Zur weiteren Vereinfachung von : s Sei P′ := P ( P revertiert), und ′ die Präfixfunktion von P′. Sei weiter k maximal unter allen Worten mit der Eigenschaft, dass P[ j + 1..m] Suffix von P[1..k ] ist. Lemma: π′[l ] = m − j , wobei l = (m − k ) + (m − j ). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 267 Beweis: P′[1..m − j ] ist Suffix von P′[1..l ] , also π′[l ] ≥ m − j. Widerspruchsannahme: π′[l ] > m − j Def . π′ ⇒ P′[1..π′[l ]] ist Suffix von P′[1..l ], d.h. P′[1..π′[l ]] = P′[l − π′[l ] + 1..l ], d.h. P[m − π′[l ] + 1..m] = P[m − l + 1..m − l + π′[l ]]. Einsetzen von l = 2m − k − j ergibt : P[m − π′[l ] + 1..m] = P[k − m + j + 1..k − m + j + π′[l ]] ⇒ P[m − π′[l ] + 1..m] ist Suffix von P[1..k − m + j + π′[l ]]. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 268 13 4 Nun gilt: m − π′[l ] + 1 < m − (m − j ) + 1 = j + 1 und damit ist P[ j + 1..m] Suffix von P[1..k − m + j + π′[l ]] =: k ′ Schließlich gilt wegen π′[l ] > m − j auch k ′ > k , wobei k ′ := k − m + j + π′[l ]. zur Maximalität von k Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 269 Mit Hilfe des Lemmas und der Tatsache, dass aus π′[l ] = m − j folgt, dass j = m − π ′[l ] und k = m − l + π ′[l ], können wir die Definition von ein letztes Mal umschreiben: [ j ] = m − max ({ [m]} ∪ {m − l + π′[l ] 1≤ l ≤ m j = m − π′[l ]}) = min ({m − π[m]} ∪ {l − π′[l ] j = m − π′[l ]}) 1≤ l ≤ m Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 270 13 5 Damit: Berechne_Gutes_Suffix (P,m): π ← Berechne_Präfixfunktion( P); P′ ← Revertiere ( P); π′ ← Berechne_Präfixfunktion ( P′); for j ← 0 to m do γ[ j ] ← m − π[m] od; for l ← 1 to m do j ← m − π′[l ] ; if γ[ j ] > l − π′[l ] then γ[ j ] ← l − π′[l ] fi od; return Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen Laufzeit Berechne_Gutes_Suffix: 271 O(m) Gesamte Laufzeit Boyer-Moore: (Worst Case) Vorlesung Algorithmen (RN/MK) O((n − m )m + Σ ) WSI für Informatik, Universität Tübingen 272 13 6 7.3 Der Algorithmus von Karp-Rabin Vereinfachende Annahme: Σ = {0,1,...,9} Verallgemeinerung auf beliebige Alphabete leicht zu tun. Definiere folgende „Fingerabdrucksfunktion“ für eine Primzahl: Fp : Z → Z +p , Fp ( x ) = x (mod p ). Zur Vereinfachung sucht folgender Algorithmus nur nach dem ersten Auftreten von P in T. Er interpretiert Zeichenketten als natürliche Zahlen. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 273 Der Algorithmus von Karp-Rabin: Karp_Rabin_Matcher (T,P) p zufällige Primzahl zwischen 1 und mn 2 log (mn 2 ) ; match false; s 0; while match=false and s ≤ n − m do if Fp (T [s + 1 .. s + m]) = Fp ( P ) then match true else Berechne Fp (T [s + 2 .. s + m + 1]) aus Fp (T [s + 1 .. s + m]) ; s s+1 fi; od; return match Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 274 13 7 Entscheidend für die Effizienz des Algorithmus: Fp (T [s + 2 .. s + m + 1]) läßt sich einfach und schnell aus Fp (T [s + 1 .. s + m]) berechnen : Fp (T [s + 2 .. s + m + 1]) = (10 ⋅ (F (T [s + 1 .. s + m]) − 10 m −1 p T [s + 1]) + T [s + m + 1])(mod p ) Fp (T [s + 2 .. s + m + 1]) kann also mit konstant vielen arithmetischen Operationen modulo p aus Fp (T [s + 1 .. s + m]) berechnet werden, falls 10 m−1 (mod p ) schon einmalig vorausberechnet wurde. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 275 Beispiel: T= 0 2 3 1 4 P= 3 1 4 1 5 1 5 2 6 7 3 9 9 2 Primzahl p = 13 ⇒ F13 ( P ) = 7 F13 (T [1 .. 5]) = F13 (0 2 3 1 4 ) = 0 F13 (T [2 .. 6]) = F13 (2 3 1 4 1) = 1 F13 (T [3 .. 7 ]) = F13 (3 1 4 1 5) = 7 Match! F13 (T [9 .. 13]) = F13 (6 7 3 9 9 ) = 7 Mismatch! Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 276 13 8 Mitteilung: Der Karp-Rabin-Algorithmus benötigt O(n+m) Schritte 1 und hat Fehlerwahrscheinlichkeit O . n Im Gegensatz zu anderen Algorithmen läßt sich der Karp-RabinAlgorithmus leicht auf zweidimensionale Mustersuche verallgemeinern und ist auch für „Online-(Realzeit)-Eingabe“ geeignet. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 277 7.4 Suffixbäume: Definition: Ein Suffixbaum T für eine Zeichenkette S mit S = n ist ein Baum mit Wurzel mit n Blättern, nummeriert von 1 bis n: • • • Jeder interne, von der Wurzel verschiedene Knoten hat mindestens zwei Kinder und jede Kante in T ist mit einem nichtleeren Teilwort von S beschriftet. Keine zwei Kanten, die einen Knoten verlassen, können Beschriftungen haben, die mit demselben Buchstaben beginnen. Für jedes Blatt i (1 ≤ i ≤ n ) gilt, dass die Konkatenation der Kantenbeschriftungen auf dem Pfad der Wurzel zu i genau das Suffix S [i .. n] von S ergibt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 278 13 9 Um zu gewährleisten, dass Suffixbaum für eine Zeichenkette S immer existiert, nehmen wir an, dass S [n] = $, wobei $ ein Sonderzeichen, das nirgends sonst in S vorkommt. Beispiel: S=aabbabb$ $ a bb abbabb$ 1 b abb$ 2 Vorlesung Algorithmen (RN/MK) 8 abb$ $ 5 $ b 4 abb$ $ 7 3 WSI für Informatik, Universität Tübingen 279 Eine erste Anwendung: Lösung des grundlegenden Problems „Mustersuche in Zeichenketten“ mittels Suffixbäumen: Gegeben Suffixbaum T für Text S und ein Muster P. Gehe in T entlang des durch P eindeutig bestimmten Pfades, bis P entweder „erschöpft“ ist oder bis keine Übereinstimmung mehr möglich ist. Im ersten Fall repräsentiert jedes Blatt im zugehörigen Unterbaum die Anfangsposition eines Vorkommens von P in S. Im zweiten Fall kommt P nicht in S vor. Beispiel (Fortsetzung): P = ab , S = aabbabb$ P kommt in S ab den Positionen 2 und 5 vor. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 280 14 0 Es gilt: Kommt P k-mal in S vor, so ist die Zeit zur Bestimmung aller Vorkommen von P in S (bei gegebenem Suffixbaum) O(m+k). Denn: Mache Tiefensuche auf betreffendem Unterbaum und notiere die vorkommenden Blattnummern. Da jeder innere Knoten mindestens zwei Kinder hat, ist die Zahl der vorkommenden Blätter proportional zur Zahl der traversierten Kanten und somit ist die Laufzeit der Tiefensuche O(k). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 281 Ein naiver Algorithmus zum Aufbau von Suffixbäumen: Idee: Beginne mit einzelner Kante für das Suffix S [1 .. n]. Mit i=2 beginnend, füge sukkzessiv Suffixe S [i .. n ] hinzu. Genauer: Sei Ni der Baum, der nach eintragen von Suffix S [i .. n ] entstand. Konstruktion von Ni+1 aus Ni: Starte an der Wurzel von Ni und finde den eindeutig bestimmten längsten Pfad, der mit einem Präfix von S [i + 1 .. n ] übereinstimmt. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 282 14 1 Zwei Fälle: •Der Pfad endet inmitten einer Kante (u,v) in T: Dann zerteile (u,v) in zwei Kanten durch Einfügen eines neuen Knoten w an der Stelle, wo die letzte Buchstabenübereinstimmung war. Beschrifte Kanten (u,w) und (w,v) durch entsprechende Aufteilung der Kantenbeschriftung für (u,v). (*) Füge neue Kante (w,i+1) hinzu und beschrifte sie mit dem Suffix von S [i + 1 .. n] , das noch nicht beim Finden des beschriebenen längsten Pfades verbraucht wurde. •Der Pfad endet an einem Knoten w in T : Vorlesung Algorithmen (RN/MK) (*). WSI für Informatik, Universität Tübingen 283 Bei Annahme eines Alphabets konstanter Größe hat obiger Algorithmus Laufzeit O(n²). Mitteilung: Mit Hilfe der Algorithmen von McCreight, Weiner oder Ukkonen lassen sich Suffixbäume in Zeit O(n) aufbauen. Anwendungen von Suffixbäumen: Natürlich sind Suffixbäume den Algorithmen von KMP oder BM weit überlegen, falls für eine gegebene, feste (!) Zeichenkette mehrmals häufig nach verschiedenen Mustern gesucht werden muss. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 284 14 2 Verallgemeinerte Suffixbäume: Darstellung einer Menge von Zeichenketten{S1 , S 2 , ... , S r } anstelle nur einer. Eine Konstruktionsmöglichkeit: Nimm an, alle r Zeichenketten enden in verschiedenen Endsymbolen $1 ,$ 2 , ... ,$ r. Konkateniere S1 , S 2 , ..., S r und bilde Suffixbaum für konkatenierte Zeichenkette in Zeit O( S1 + ... + S r ) . Die entstehenden Blattnummern lassen sich leicht in zwei Blattnummern umwandeln, wobei eine die zugehörige Zeichenkette und die andere die Position in der jeweiligen Zeichenkette bezeichnet... Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 285 Problem: „Künstliche Suffixe“, die sich über mehr als eine Zeichenkette erstrecken. Da aber $i ≠ $ j für i ≠ j , muss jeder Pfad von der Wurzel zu einem inneren Knoten mit einer Teilzeichenkette nur einer der Zeichenketten S1 , S 2 , ... , S r beschriftet sein. Daher können nur Kanten zu Blättern mit Teilwörtern aus verschiedenen Zeichenketten beschriftet sein; Weglassen des entsprechenden zweiten Beschriftungsteils löst das Problem. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 286 14 3 Beispiel: S1 = ab$1 , S 2 = aa$ 2 , S 3 = S1 o S 2 = ab$1 aa$ 2 $2 a $1 aa$ 2 b$1 aa$2 b$1 aa$2 $2 a$ 2 1 6 3 5 2 4 Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 287 Anwendung: Längste gemeinsame Teilzeichenkette zweier Zeichenketten Beispiel: S1 = superiorcalifornialives S2= sealiver Lösung: alive Satz: Das Problem des Findens der längsten gemeinsamen Zeichenkette zweier Zeichenketten S1 und S2 kann in Zeit O( S1 + S 2 ) gelöst werden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 288 14 4 Allgemeine Lösungsmethode: •Bilde verallgemeinerten Suffixbaum für S1 und S2. Jedes Blatt repräsentiert entweder ein Suffix von S1 oder ein Suffix von S2. •Markiere jeden inneren Knoten v mit 1 bzw. 2 je nachdem, ob es ein Blatt in seinem Unterbaum gibt, das ein Suffix von S1 oder S2 ist. •Die Pfadbeschriftungen zu einem mit sowohl 1 als auch 2 markierten inneren Knoten bilden eine gemeinsame Teilzeichenkette von S1 und S2. Suche also denjenigen Pfad dieser Art, der die längste Teilzeichenkette ergibt. Dies geht z.B. mit Tiefensuche in Linearzeit. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 289 Anwendung: Datenkompression: Definition: Gegeben: Eine Zeichenkette S der Länge n und sei 1 ≤ i ≤ n 1. Die Teilzeichenkette Priori ist das längste Präfix von S[i .. n], welches zugleich als Teilzeichenkette in S[1.. i-1] vorkommt. 2. li := Priori und für li > 0 sei si die Anfangsposition des am weitesten linken Vorkommen von Priori in S[1.. i-1]. Beispiel: S= 1 2 3 4 5 6 7 8 9 10 11 12 a b a x c a b a x a b z Prior7 = b a x l7 = 3, s7 = 2. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 290 14 5 Wir betrachten Variante der Ziv-Lempel-Kompressionsmethode Idee: Falls S[1.. i-1] schon repräsentiert (komprimiert?!) ist und falls li > 0, so müssen die nächsten li Buchstaben von S (d.h. Priori) nicht explizit angegeben werden, sondern können durch das Paar (si,li) beschrieben werden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 291 Kompressionsalgorithmus: i 1; repeat do berechne li und si ; if li > 0 then output (si, li); i i+ li else output S[ i ]; i i+ 1 fi; until i > n Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 292 14 6 Beispiel: 1. S = a b a c a b a x a b z ab (1,1) c (1,3) x (1,2 ) z 2. S = (ab )16 ab (1,2 )(1,4 )(1,8)(1,16 ) Implementierung des Kompressionsalgorithmus mit Hilfe von Suffixbäumen: Zentral: Berechnung von li und si. Beobachtung: Komprimierte Teilwörter überlappen nicht miteinander. Falls jedes gewünschte Paar (si,li) in Zeit O(li) gefunden werden kann, so ist die Gesamtlaufzeit des Algorithmus O(n). Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 293 Realisierung: Zunächst konstruiere Suffixbaum T zu S in Linearzeit. Nummeriere jeden Knoten v mit: cv := kleinste Blattnummerierung im Unterbaum von v D.h., cv gibt die am weitesten linke Anfangsposition in S für alle Vorkommen derjenigen Teilzeichenkette in S, die den Pfad von der Wurzel von T bis v beschriftet. Mit Standardbaumtraversierungen (z.B. Tiefensuche) können die cv -Werte in O(n) Zeit für alle Baumknoten bestimmt werden. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 294 14 7 Nun Anwendung der cv -Werte: Zur Berechnung von (si,li) folgt der Algorithmus dem eindeutig bestimmten Pfad in T, der durch ein Präfix von S[i .. n] bestimmt ist. Der Pfad endet an einem Punkt p (nicht notwendig einem Knoten) und sei v der erste Knoten nach p (p = v möglich). Dabei ergibt sich p entweder dadurch, dass ein Mismatch auftritt oder dass auf dem Pfad zu p bereits i- cv Symbole „verbraucht“ wurden. si := cv li := Zahl der auf dem Pfad zu p verbrauchten Symbole Bei konstanter Alphabetgröße findet sich somit (si,li) in Zeit O(li), w.z.z.w. Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 295 < Ende Vorlesung Algorithmen > Vorlesung Algorithmen (RN/MK) WSI für Informatik, Universität Tübingen 296 14 8