Technische Universitat Munchen Institut fur Informatik E ziente Algorithmen und Datenstrukturen WS 1998/99 (WS 97/98) Stand: 22. Juni 1999 Dozent: Mitschrift: Prof. Dr. Ernst W. Mayr Bardia Kabiri (Martin Stumpf) (Thomas Schopf) (Martin Hans) (Guido Wimmel) Inhaltsverzeichnis 0 Einleitung und Aurischung 0.0 0.1 0.2 0.3 Einleitendes Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . Was sind "kombinatorische\ Algorithmen? . . . . . . . . . . . . . . . Maschinenmodelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . Komplexitatsma e . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.3.1 Probleme und Funktionen . . . . . . . . . . . . . . . . . . . . 0.3.2 Wachstumsverhalten von Funktionen . . . . . . . . . . . . . . 0.3.3 Rekursionsgleichungen . . . . . . . . . . . . . . . . . . . . . . 0.3.3.1 Multiplikatoren . . . . . . . . . . . . . . . . . . . . . 0.3.3.2 Charakteristisches Polynom . . . . . . . . . . . . . . 0.3.3.3 Erzeugendenfunktionen . . . . . . . . . . . . . . . . 0.3.3.4 Transformation des Denitions- bzw. Wertebereichs 1 Hohere Datenstrukturen 1.1 Grundlegende Operationen . . . . . . . . . . . . . . . . . . . . . 1.2 Suchbaume, balancierte Baume . . . . . . . . . . . . . . . . . . . 1.2.1 Hohenbalancierte Baume . . . . . . . . . . . . . . . . . . 1.2.1.1 (a,b)-Baume . . . . . . . . . . . . . . . . . . . . 1.2.1.2 Rot-Schwarz-Baume . . . . . . . . . . . . . . . . 1.3 Binare Suchbaume . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1 Naturliche binare Suchbaume . . . . . . . . . . . . . . . . 1.3.2 Hohenbalancierte binare Suchbaume (AVL-Baume) . . . . 1.4 Hashing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.2 Chainingverfahren . . . . . . . . . . . . . . . . . . . . . . 1.4.3 Hashing mit oener Adressierung . . . . . . . . . . . . . . 1.4.4 Universelles Hashing . . . . . . . . . . . . . . . . . . . . . 1.4.5 Perfektes Hashing . . . . . . . . . . . . . . . . . . . . . . 1.5 Priority Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.1 Binomial Queues (binomial heaps) . . . . . . . . . . . . . 1.5.2 Fibonacci-Heaps . . . . . . . . . . . . . . . . . . . . . . . 1.5.2.1 Die Datenstruktur . . . . . . . . . . . . . . . . . 1.5.2.2 Amortisierte Kostenanalyse fur Fibonacci-Heaps 1.6 Sich selbst organisierende Datenstrukturen . . . . . . . . . . . . . 1.6.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.2 Sich selbst organisierende lineare Listen . . . . . . . . . . 1.6.2.1 Sich selbst organisierende Binary Keys . . . . . 1.6.2.2 Splay-Trees als Suchbaume . . . . . . . . . . . . 1.6.2.2.1 Einleitung . . . . . . . . . . . . . . . . 1.6.2.2.2 Die Splaying-Operation . . . . . . . . . 1.6.2.2.3 Amortisierte Kostenanalyse . . . . . . . 1.6.2.2.4 Worterbuchoperationen in Splay-Trees 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 4 4 5 5 6 6 7 8 9 11 11 12 12 12 15 18 18 19 21 21 21 22 24 24 25 25 31 31 34 36 36 36 38 41 41 42 43 47 INHALTSVERZEICHNIS 2 1.6.3 Weitere Arten von Datenstrukturen . . . . . . . . . 1.7 Radix-basierte Priority-Queue . . . . . . . . . . . . . . . . . 1.7.1 Buckets . . . . . . . . . . . . . . . . . . . . . . . . . 1.7.1.1 1-Level-Buckets . . . . . . . . . . . . . . . 1.7.1.2 2-Level-Buckets . . . . . . . . . . . . . . . 1.7.1.3 k-Level-Buckets . . . . . . . . . . . . . . . 1.7.2 Von-Ende-Boas-PQ . . . . . . . . . . . . . . . . . . . 1.7.3 Radix-Heaps . . . . . . . . . . . . . . . . . . . . . . 1.8 Union-Find-Datenstrukturen . . . . . . . . . . . . . . . . . 1.8.0 Motivation . . . . . . . . . . . . . . . . . . . . . . . 1.8.1 Union-Find-Datenstruktur . . . . . . . . . . . . . . . 1.8.1.1 Intrees . . . . . . . . . . . . . . . . . . . . 1.8.1.2 Gewichtete Union (erste Verbesserung) . . 1.8.1.3 Pfad-Kompression mit gewichteten Union Verbesserung) . . . . . . . . . . . . . . . . 1.8.1.4 Erweiterung . . . . . . . . . . . . . . . . . ..... ..... ..... ..... ..... ..... ..... ..... ..... ..... ..... ..... ..... (zweite ..... ..... 2 Selektieren und Sortieren 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Blum-Floyd-Pratt-Rivest-Tarjan Selektions-Algorithmus Randomisierter-Median-Algorithmus . . . . . . . . . . . . . . Der SPP-Algorithmus . . . . . . . . . . . . . . . . . . . . . . Eine untere Schranke fur die Medianbestimmung . . . . . . . Eine bessere untere Schranke . . . . . . . . . . . . . . . . . . Untere Schranke fur (vergleichbasiertes) Sortieren . . . . . . . Bucketsort im Schnitt . . . . . . . . . . . . . . . . . . . . . . Quicksort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 Grundlegende Begrie . . . . . . . . . . . . . . . . . . . . . . 4.2 Das single-source-shortest-path-Problem . . . . . . . . . . . . 4.2.1 Dijkstra's Algorithmus . . . . . . . . . . . . . . . . . . 4.2.2 Dikstra's Algorithmus mit Radix-Heaps . . . . . . . . 4.2.3 Bellman-Ford-Algorithmus . . . . . . . . . . . . . . . 4.3 Floyd's Algorithmus fur das All-pairs-shortest-path-Problem . 4.4 Digraphen mit negativen Kantengewichten . . . . . . . . . . . 4.4.1 Grundsatzliches . . . . . . . . . . . . . . . . . . . . . . 4.4.2 Modikation von Bellman-Ford-Algorithmus . . . . . . 4.4.3 Modikation von Floyd's-Algorithmus . . . . . . . . . 4.4.4 Der Algorithmus von Johnson . . . . . . . . . . . . . . 4.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 4.6 Transitive Hulle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Minimale Spannbaume 3.0 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Traversierung von Graphen . . . . . . . . . . . . . . . . 3.1.1 DFS-Algorithmus . . . . . . . . . . . . . . . . . . 3.1.2 DFS-Algorithmus . . . . . . . . . . . . . . . . . . 3.2 Minimale Spannbaume . . . . . . . . . . . . . . . . . . . 3.2.1 Konstruktion von minimalen Spannbaumen . . . 3.2.2 Generischer minimaler Spannbaum-Algorithmus 3.3 Kruskals Algorithmus . . . . . . . . . . . . . . . . . . . 3.4 Prim's Algorithmus, erste Variante . . . . . . . . . . . . 3.5 Prim's Algorithmus, zweite Variante . . . . . . . . . . . 4 Kurzeste Pfade . . . . . . . . . . . . . . . . . . . . 48 48 48 49 51 54 55 58 60 60 61 61 61 61 63 65 65 66 67 69 77 79 83 84 84 87 87 89 89 90 91 92 94 94 96 98 101 101 101 102 104 106 106 107 107 108 108 108 109 110 INHALTSVERZEICHNIS 3 4.6.1 Min-Plus-Matrix-Produkt und Min-Plus-Transitive Hulle . . 110 4.6.2 Boolesche Matrixmuliplikation und Transitive Hulle . . . . . 111 4.6.3 Der 4-Russen-Algorithmus fur Boolesche Matrixmultiplikation 112 4.6.4 Transitive Hulle und DFS . . . . . . . . . . . . . . . . . . . . 115 4.7 Ein besserer Algorithmus fur das All-pairs-shortest-distance-Problem 117 4.8 Ein Algorithmus fur die transitive Hulle mit lin. erwarteter Laufzeit 118 4.9 Matrizenmultiplikation a la Strassen . . . . . . . . . . . . . . . . . . 121 5 Matchings in Graphen 124 5.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 5.2 Matchings maximaler Kardinalitat in bipartiten Graphen . . . . . . 128 Kapitel 0 Einleitung und Au rischung 0.0 Einleitendes Beispiel Berechnung von Fn , die n ; te Fibonachi-Zahl: F0 = 0 F1 = 1 Fn = Fn;1 + Fn;2 fur alle n 2 1.Methode: Funktionales Programmieren f(n) := if n = 0 then 0 elseif n = 1 then 1 else f(n ; 1) + f(n ; 2) fi T(n) : Zeitbedarf fur die Berechnung von f(n) : T(n) = T(n ; 1) + T(n ; 2) n 2 T(0) = T(1) = 1 p n p n )T(n) = c1 1+2 5 + c2 1;2 5 p p n=1: 1 = c1 ( 1+2 5 ) + c2 ( 1;2 5 ) n = 0 :p 1 = c1 + c2 c1 = 21 + p105 c2 = 12 ; 105 p p p p ) T(n) = ( 12 + 105 )( 1+2 5 )n + ( 12 ; 105 )( 1;2 5 )n 2.Methode: Dynamische Programmierung array: F0 : n] F0] = 0 F1] = 1 for i = 2 to n do Fi] = Fi ; 1] + Fi ; 2] Zeitbedarf : O(n) 3.Methode: Direkt (mit etwas mathematischer Arbeit) p !n p !n ! 1 + 1 5 ; 1; 5 F(n) := p 5 2 2 Zeitbedarf: O(log n)) 3 KAPITEL 0. EINLEITUNG UND AUFFRISCHUNG 4 0.1 Was sind "kombinatorische\ Algorithmen? Probleme, die, konnten wir alle Falle aufzahlen, trivial waren, aber eine sehr gro e Anzahl von Fallen haben. Beispiel: Hamiltonscher Kreis (NP-vollstandig), Eulerscher Kreis (P) 0.2 Maschinenmodelle Turingmaschine (TM) Random Access Machine (RAM) Schaltkreise (Quantencomputer) (DNA-Computer) 0.3 Komplexitatsmae . Lesekopf Eingabeband + Steuereinheit Q s Q Speicher- zugriffseinheit Speicher - M0 M1 Ausgabeband - Schreibkopf 2Z .. . 1? Abb. 1: Random Access Machine Problem: Sprache L, Alphabet , 8x 2 : { Halt die Maschine nach endl. Zeit und gibt eine Antwort? x 2 L : Antwort \ja\ x 62 L : Antwort \nein\ Maschine entscheidet L f (x), Maschine berechnet f (partielle Funktion) { Entweder halt die Maschine nach endl. Zeit und sagt \ja\ oder die Maschine halt nicht oder halt und sagt \nein\. Falls 8x 2 L, o.B.d.A. das nicht vorkommt, ) Maschine akzeptiert L Wie werden die Kosten berechnet? Betrachte Eingaben x der Lange n { worst-case Komplexitat: C(n) := maxfKomplexitat(x) jxj = ng { durchschnittliche Komplexitat (average complexity): C(n) := j1n j X jxj=n Komplexitat(x) allgemeiner: Wahrscheinlichkeitsma C(n) := X x2n (x) Komplexitat(x) { amortisierte Komplexitat: durchschnittliche Kosten der Operationen in Folgen worst-case uber alle Folgen von Operationen KAPITEL 0. EINLEITUNG UND AUFFRISCHUNG { probabilistische oder randomisierte Komplexitat: 5 Algorithmus hat Zufallsbits zur Verfugung. Erwartete Laufzeit (uber alle Zufallsfolgen) fur feste Eingabe x, dann worst-case fur alle jxj = n. Ressourcen { Rechenzeit { Speicherplatz { Anzahl von Vergleichen { Anzahl von Multiplikationen { Schaltkreisgro e { Programmgro e { Schachtelungstiefe von Laufschleifen Kosteneinheiten: { uniformes Kostenmodell { logarithmisches Kostenmodell: Kosten Lange der Operanden Beispiel: r := 2 for i = 1 n () r2 ) to n do r = r2 od Zeit: { uniform: n-Schritte { logarithmisch: 1 + 2 + 4 + + 2n = nn;1 + 1 = O(2n) Platz: { uniform: 1 { logarithmisch: 2n 0.3.1 Probleme und Funktionen Probleme sind Teilmengen von , wobei endliches Alphabet ist. Berechnung von Funktionen: Denition: Seien ; Alphabete. Eine TM (bzw. RAM) M berechnet eine (partielle) Funktion f : ! ; gdw. (8x 2 ) falls M mit Eingabe x halt, dann ist die Ausgabe von M gleich f(x) x 2 Denitionsbereich von f]. 0.3.2 Wachstumsverhalten von Funktionen Denition: f g seien Funktionen von N nach R g(n) ist O(f(n)) auch: g ist O(f), g(n) = O(f(n)), g(n) 2 O(f(n))] gdw. (9C 2 R 9n0 2 N)(8n n0 )jg(n)j C jf(n)j]] 3 Beispiel: n3 ist nicht O logn n g(n) ist (f(n)) gdw. (9C > 0 9n0 2 N)(8n n0 )jg(n)j C jf(n)j]] KAPITEL 0. EINLEITUNG UND AUFFRISCHUNG 6 g(n) ist !(f(n)) gdw. g ist O(f) und g ist (f) g(n) ist o(f(n)) gdw. (8C > 0 9n0 )(8n n0 )jg(n)j C jf(n)j]] g(n) ist !(f(n)) gdw. (8C > 0 9n0 )(8n n0 )jg(n) C jf(n)j]] g(n) ist 1 (f(n)) gdw. (9C > 0)jg(n)j C jf(n)j fur unendlich viele n] Beispiel: n2 sin 2 n = 1 (n) g(n) ist !1 (f(n)) gdw. (8C > 0)jg(n)j C jf(n)j] fur unendlich viele n] 0.3.3 Rekursionsgleichungen Mergesort: T(n) = 2T n2 + cn = cn + 2T n2 = cn + 2 c n2 + 2T n4 = cn + cn + 4T n4 cn log2 n (nur genau fur Zweierpotenzen, sonst 1) Allgemein: C(n) = F1 (C(n(1) ) C(n(2) ) : : : C(n(r) )) + F2 (n) n(i) < n fur alle i 0.3.3.1 Multiplikatoren f1 = 1 fn = 2fn;1 + n n 2 fn = 2fn;1 + n fn;1 = 2fn;2 + n ; 1 .. . f2 = 2f1 + 2 f1 = 1 j1 j2 .. . 9 > > > > > > > > > > > = nX ;2 > i=0 fn = 2n;1 f1 + > > > j 2n;2 > > > > n ; 1 > j2 > > 2i (n ; i) = 2n+1 ; n ; 2 Addieren aller Gleichungen: fn = 2n;1 + nX ;2 i=0 2i (n ; i) = 2| n{z;1} + n (2) (Geometrische Reihe): n (1) nX ;2 i=0 2i ; | {z } (2) nP ;2 i 2 = n(2n;1 ; 1) i=0 nX ;2 i 2i i=0{z | (3) } KAPITEL 0. EINLEITUNG UND AUFFRISCHUNG (3) (Substitution: n ; 2 = k): k X i=0 ixi = k X ixi (erster Summand ist 0) i=1 k X =x =x ixi;1 i=1 k dxi X i=1 d = x dx dx k X i=1 xi d xk+1 ; 1 = x dx x;1 k+2 ; xk+1 (k + 1) + x kx = (x ; 1)2 Einsetzen von k = n ; 2 und x = 2: nX ;2 i=0 i2i = 2n (n ; 2) ; 2n;1(n ; 1) + 2 = 2n n ; 2n+1 ; 2n;1 n + 2n;1 + 2 (2) ; (3): n nX ;2 i=0 2i ; nX ;2 i=0 i2i = n (2n;1 ; 1) ; 2nn + 2n+1 + 2n;1n ; 2n;1 ; 2 = 2n;1 (2n ; 1) ; 2n (n ; 2) ; n ; 2 (1) + (2) ; (3): 2n;1 + n nX ;2 i=0 2i + nX ;2 i=0 i2i = 2n;1 + 2n;1 (2n ; 1) ; 2n (n ; 2) ; n ; 2 = 2n+1 ; n ; 2 0.3.3.2 Charakteristisches Polynom Sei () fn = fn;1 + fn;2 fur n 2 f1 = 1 f0 = 0 (lineare homogene Rekursionsgleichung zweiter Ordnung) Setze fn = an fur ein unbekanntes a. p an ; an;1 ; an;2 = 0 da hier a 6= 0: a2 ; a ; 1 = 0 a1=2 = 12 5 a1 und a2 Losungen von (), dann auch fn = c1 an1 + c2 an2 eine Losung fur (). f1 = 1 und f0 = 0hliefern p5 zwei p5 n i fur c1 und c2 . n Gleichungen 1+ 1 1 ; Losung: fn = p5 ; 2 2 7 KAPITEL 0. EINLEITUNG UND AUFFRISCHUNG 8 Satz: Sei p(x) das charakteristische Polynom der Rekursionsgleichung () p0 fn + p1 fn;1 + : : : + pk fn;k = 0 mit den konstanten Koe"zienten pi . Seien ri i = 1 : : : m die (i. a. komplexen) Wurzeln von p(x), jeweils mit Vielfachheit mi . Dann ist die allgemeine Losung von () gegeben durch fn = m X i=1 0 rin @ mX i ;1 j =0 1 cij nj A mit Konstanten cij . 0.3.3.3 Erzeugendenfunktionen Fur lineare und nicht lineare Rekursionsgleichungen erhalt man oft eine Losung, indem man die fn als Koe"zienten einer Potenzreihe betrachtet und eine geschlossene Form, der dadurch denierte Funktion sucht. Denition: Fur eine Folge (fn)n0 ist die \erzeugende Funktion\ deniert als: F(z ) = 1 X n=0 fn z n z 2 C Exponentielle Erzeugendenfunktion: X F(z ) = nfn! z n n0 auch Notation: F(z ) = Sei F(z ) = X n>0 P n>0 fn z n ) fn = z n]F(z ) fn z n und G(z ) = Erz. Fkt. F+G zkF F(z) 1;z z dF(z) Rx dz F(t)dt 0 F(cz ) n0 gn z n n-tes Folgenglied cfn fn + gn cF FG P hn := n P i=0 fi gn;i (Konvolution) Anmerkungen: P n0 fn z n ! P gn z n = n0 n P (mit hn = ! i=0 fi gn;i ) P n0 hn z n if n < k then 0else fn;k n P fi 1 1;z if n = 0 then 0 else fnn;1 cn fn fn z n ("geht uber auf\) fn zn+1 P P F(cz ) = fn (cz )n = fn cn z n i=0 nfn = P n0 zn n+1 n0 n0 KAPITEL 0. EINLEITUNG UND AUFFRISCHUNG Beispiel: F(z ) := G(z ) := X n 0 X n0 2n z n = 1 ;1 2z nz n = (1 ;z z )2 ) F(z )G(z ) = (1 ; z )2z(1 ; 2z ) = n XX n0 i=0 (n ; i)2i z n Partialbruchzerlegung: z (1) (2) z }| { (1 ; z )2 (1 ; 2z ) z }| { z + 2 = (1;;2z ) ; (1 ; ; z )2 1 ; 2z = X n 0 2n+1 z n ; | {z (2) } X n0 nz n ; 2 X n0 z n | {z } (1) Also: n X i=0 2i (n ; i) = z n](FG)(z ) 0 = z n] @ X 1 (2n+1 ; n ; 2)z nA n0 n +1 = 2 ; n ; 2 0.3.3.4 Transformation des Denitions- bzw. Wertebereichs Beispiel 1: fn = fn;1 fn;2 fur n 2 f1 = 2 f0 = 1 Setze: gn = log fn ) gn = gn;1 + gn;2 fur n 2 g1 = log 2 = 1 g0 = 0 fur log = log2 ) gn = Fn (n-te Fibonacci-Zahl) ) fn = 2Fn Beispiel 2: fn = 3f n2 + n fur n = 2k 9 KAPITEL 0. EINLEITUNG UND AUFFRISCHUNG f1 = 1 Setze: gk = f2k Dann: gk = 3gk;1 + 2k k 1 g0 = 1 Es ergibt sich: gk = 3k+1 ; 2k+1 also: fn = 3 3k ; 2 2k = 3(2log 3 )k ; 2 2k = 3(2k )log 3 ; 2 2k = 3nlog 3 ; 2n 10 Kapitel 1 Hohere Datenstrukturen 1.1 Grundlegende Operationen Es sei U das Universum von Schlusseln mit der Ordnung . Menge S U . Gegeben seien eine Menge von Datensatzen x1 xn , wobei jeder Datensatz x durch einen Schlussel Key(x) = K S gekennzeichnet ist. x = (KVal(K )). IsElement(K S ): Insert(K S : Delete(K S ): FindMin(S ): FindMax(S ): DeleteMin(S ): DecreaseKey(K $ S ): Union(S1 S2 ): Find(K ): Merge(S1 S2 ): Split(S1 K S2 ): Concatenate(S1 S2 ): ist K 2 S , wenn ja, return Val(K ) S := S fK g S := S n fK g return min S return max S S := S n min S Ersetze K durch K ; $ S1 = S1 S2 Falls K 2 S , so nde (KVal(K )) S1 = S1 S2 , falls S1 \ S2 = S2 = fK 0 2 S2 jK 0 K g S1 = fK 0 2 S1 jK 0 < K g S1 := S1 S2 Voraussetzung: FindMax(S1 ) FindMax(S2 ) Datenstrukturklasse mindestens angebotene Funktionen Worterbuch (Dictiona- IsElement(), Insert(), ry) Delete() Vorrangwarteschlange FindMin(), Insert(), De(Priority Queue) lete(), IsElement()] Mergeable heaps FindMin(), Insert(), Delete(), Merge() Concatenable queues FindMin(), Insert(), Delete(), Concatenate() 11 realisiert in Hashtable, balancierte Baume balancierte, Leftist-, Binomialbaume 2-3-Baume, Binomialwalder, Leftist-Baume 2-3-Baume KAPITEL 1. HOHERE DATENSTRUKTUREN 12 1.2 Suchbaume, balancierte Baume 1.2.1 Hohenbalancierte Baume Denition: Bei einem externen Suchbaum werden die Datenelemen- te nur an den Blattern gespeichert, und die inneren Knoten enthalten Verwaltungsinformationen. Bei internen Suchbaumen liegen die Datenelemente an den internen Knoten. Zeiger auf Blatter sind NIL-Pointer. Daher kann man sagen: An allen Knoten sind Daten gespeichert. 1.2.1.1 (a,b)-Baume Denition: Ein (a,b)-Baum ist ein externer Suchbaum, alle Blatter haben die gleiche Tiefe, die Anzahl der Kinder eines jeden internen Knoten ist b und a (Fur die Wurzel 2), und es gilt b 2a ; 1. Spezialfall: b = 2a ; 1 (B-Baume). Mit jedem internen Knoten V mit d =Grad(V ) werden (d + 1) Schlusselwerte K0 : : : Kd gespeichert. K0 = ;1, Kd = +1 , Ki;1 < (alle Schlussel im i Unterbaum von V ) Kd etwa (*): ki = max(Schlussel im i-ten UB von V ) Sortierung im (a,b)-Baum: (Schlussel im i-ten UB) (Schlussel im (i + 1)-ten UB) Beispiel: Wir betrachten im folgenden (2,4)-Baume. 2 ! l ! l ! !! l 3 4 5 1 A A B A 1 2 3 4 B 5 A 6 Lemma: Sei T ein (a,b)-Baum mit n Blattern und der Hohe h. Dann gilt: (1) 2ah;1 n bh n n (2) logb n = log log b h 1 + loga 2 Beweis: (1) n bh : Maximal fur vollstandigen Baum-Verzweigungsgrad b. Minimal fur Baum mit Grad der Wurzel = 2, alle anderen internen Knoten = a. (2) aus (1). 3 KAPITEL 1. HOHERE DATENSTRUKTUREN 13 Operationen: 1. IsElement(K S ) v T := Wurzel von while = Blatt do v6 i = minfsj1 s Grad v v := i-tes Kind von v K KS g and od if =Key( ) then return Val( ) else return False fi K v k Zeitbedarf: (h) = (log n) 2. Insert(K S ) Fuhre IsElement(K T ) aus. Blatt w Sei Key(w) 6= K , w enthalt unter (*) den kleinsten Schlussel > K Fuge K links von w ein v =Vater von w Falls Grad v = b + 1: Rebalancierung (v) 3 ! ! l l ! !! l 4 5 7 1 2 A A B A 1 3 4 2 B + 7 A 8 6 3 6 a a a aa 1 2 4 5 7 A A A 1 5 2 A 3 4 5 A 6 A 7 8 Rebalancierung(v): a) Falls ein unmittelbarer Bruder v0 von v Grad < b hat, v0 adoptiert au erstes links/rechts Kind von v. b) Sonst: Spalte Menge C aller Kinder von v in C1 C2 (gleichgro ). Spalte Knoten v in v1 v2 ,v1 ubernimmt C1 , v2 ubernimmt C2 b+1 a b b+1 2 c d 2 e b wegen b 2a ; 1 Kosten O(log N ) KAPITEL 1. HOHERE DATENSTRUKTUREN 14 3. Delete(x S ): Fuhre IsElement(K T ) aus. Blatt w. Sei Key(w) = K Losche w v := Vater w Falls Grad v = a ; 1: Rebalancierung0(v) 2 4 Q Q Q Q 1 2 5 6 A A A A 1 5 A 6 7 . oder & 2 5 4 H Q H HH QQ 1 2 A 5 6 A 1A 4A 6A 1 A @3; 4 ;@ 2 2 A 4 5 6 A 7 A 1 2 A 4 5 A 6 7 Rebalancierung0(v): a) Falls ein unmittelbarer Bruder v0 von v Grad > a hat: v adoptiert Kind von v0 b) Sonst verschmelze v mit einem unmittelbaren Bruder Zeitbedarf: O(log n) Spezialfalle von (a b)-Baume: - (2 3)-Baume, - (2 4)-Baume, - (a 2a ; 1)-Baume (B-Baume) Bemerkungen: 1. Zur Wahl von a: Daten in RAM ) a klein, z.B. a = 2 oder a = 3. Daten auf Platte ) a gro , z.B. a = 100. 2. Zur Wahl von b: b 2a liefert wesentlich bessere amortisierte Komplexitat (ohne Beweis, siehe Mehlhorn). 3. Top-Down-Rebalancierung: b 2a. Bei der Restrukturierung nach der Top-Down-Strategie, folgen wir wie gewohnt dem Pfad von der Wurzel zum gesuchten Blatt. Beim Einfugen stellen wir jetzt jedoch fur jeden besuchten Knoten sicher, da der Knoten weniger als b Kinder hat. Wenn der gerade betrachtete Knoten ein b-Knoten ist, dann KAPITEL 1. HOHERE DATENSTRUKTUREN 15 spalten wir ihn sofort auf. Weil der Vater kein b-Knoten ist (das haben wir ja bereits sichergestellt) p'anzt sich der Aufspaltungsproze nicht nach oben hin fort. Insbesondere kann das neue Element ohne Probleme eingefugt werden, wenn die Suche das Blattniveau erreicht hat. Damit diese Strategie moglich ist, mu b mindestens 2a sein (und nicht 2a ; 1), da sonst nach der Spaltung nicht genugend Elemente fur die beiden Teile vorhanden sind. Beim Loschen verfahren wir analog. Fur jeden besuchten Knoten, au er der Wurzel des (a b)-Baumes, stellen wir sicher, da er mindestens a + 1 Kinder hat. Wenn der gerade betrachtete Knoten nur a Kinder hat, so versuchen wir zuerst ein Element des rechten oder linken Nachbarknoten zu stehlen. Sind beide Nachbarknoten vom Grad a, so verschmelzen wir unseren Knoten mit einem der beiden Nachbarn. Ist der Vater nicht die Wurzel, so hatte er aber vorher mindestens a + 1 Kinder, und dieser Verschmelzungsproze kann sich nicht nach oben fortsetzen. Andernfalls erniedrigt sich der Grad der Wurzel um 1, wenn die Wurzel Grad gro er 2 hat, oder die alte Wurzel wird geloscht und der soeben verschmolzene Knoten wird zur neuen Wurzel. Restrukturierung nach der Top-Down-Strategie sorgt nicht fur eine bessere Laufzeit, sondern erleichtert die Synchronisation, wenn mehrere Prozesse gleichzeitig auf einen (a b)-Baum zugreifen wollen. Bei herkommlichen (a b)Baumen schreiten die Such- und die Restrukturierungsoperationen in entgegengesetzten Richtungen fort, was dazu fuhrt, da sich oft Prozesse gegenseitig behindern (der eine will im Baum absteigen, der andere mu auf dem gleichen Pfad aufwarts restrukturieren). Bei der Top-Down-Strategie gibt es nur Operationsfolgen, die den Baum hinabsteigen. Mehrere Prozesse konnen so in einer Art Pipeline gleichzeitig einen Pfad mit kurzem Abstand begehen. 1.2.1.2 Rot-Schwarz-Baume Denition: Rot-Schwarz-Baume sind externe Binarbaume (jeder Knoten hat 0 oder 2 Kinder) mit roten und schwarzen Kanten, so da gilt: 1. alle Blatter hangen an schwarzen Kanten (durchgezogene Linien) 2. alle Blatter haben die gleiche "Schwarztiefe\ 3. kein Pfad von der Wurzel zu einem Blatt enthalt aufeinanderfolgende rote Kanten (gewellte Linien). Dabei ist die "Schwarztiefe\ eines Knoten die Anzahl der schwarzen Kanten auf dem Pfad von der Wurzel zu diesem Knoten. Rot-Schwarz-Baume konnen zur Implementierung von (2,4)-Baumen dienen. Vorteil: Interne Knoten haben Verzweigungsgrad = 2. pp p b d Q Q Q a c pp pp pp pp pp e pp p p p p p p ) pp p b ; ; ; a d pp p p AA p p c pp p p p p e p p pp pp pp pp KAPITEL 1. HOHERE DATENSTRUKTUREN pp p ) b d f Q Q Q a c e pp pp pp pp pp pp pp g pp p p p p p p p p 16 pp p d b f A AA A g e a c pp p p p p p p p p p p p p p p p p p p p pp p p pp p Operationen auf Rot-Schwarz implementierten (a b)-Baume: 1. IsElement(K T ) : vgl. (a b)-Baume Zeit O(log n) 2. Insert(K T ): Fuhre IsElement(K T ) aus Blatt w. Dort sei noch nicht das Element v gespeichert. Ersetze w durch interne Knoten w0 mit Kindern v w, wobei v ein neues Blatt mit Schlussel K sei. w0 behalt rote Eingangskante. Falls nun zwei aufeinanderfolgende rote Kanten an w0 vorliegen, Rotation zur Rebalancierung: S S pSp p a pp p S SS pp S p pp p SS S b S pb JJ Einfache pp p Sp S SSS Rotation p S p p p SS S c J p p a p p c p S pp J p p p p p pJpS p pJ pJp p pJ Jp p p pJ ) U1 U2 3 4 UJ UJ a @@ p @ pp p p p @ pp p c p JJ ppp p ;; p p p p p p ;; JJ pp p b p p Jp J U1 U4 2 3 UJ UJ 1 2 UJ UJ 3 4 UJ UJ pp p b Doppelte Rotation a pp p p pp pp p c p p pJ pJ pJ p pJ ) 1 2 UJ UJ 3 4 UJ UJ KAPITEL 1. HOHERE DATENSTRUKTUREN pp p b pp p a p pp pp p c p p pJ Jp pJ p pJ ) 1 2 UJ UJ 3 4 UJ UJ 17 b ; @ ; @ ; @ a pp p p pp pp p c p p pJ pJ pJ p pJ 1 2 UJ UJ 3 4 UJ UJ 3. Delete(KT): Das Loschen des Blattes v macht es erforderlich, da der Vater des Blattes durch den Bruder des Blattes ersetzt wird, damit der Binarbaumstruktur erhalten bleibt. Der Bruder von v ist naturlich eindeutig bestimmt. Dabei treten zwei Falle auf: 1.Fall b b m m a v J J w ) w m : Dadurch andert sich die Schwarztiefe von w nicht, denn die Eingangskante zu w wird (notwendig) zu schwarz umgefarbt. Auch kann es hierdurch nicht zu zwei aufeinanderfolgenden roten Kanten kommen. 2.Fall b b ; ; m ; a v J J w m ) w m Hierdurch verkleinert sich die Schwarztiefe von w um 1. Man kann sie nicht wieder erhohen, ohne dabei auch die Schwarztiefe anderer Blatter zu vergro ern. Daher mu sie fur alle anderen Blatter des Baumes um 1 verkleinert werden. Man betrachte dazu den Pfad von w zur Wurzel als unveranderlich und farbt Kanten so um, da auf allen anderen Pfaden jeweils genau eine Kante von schwarz zu rot wird. Ferner darf dabei nicht die Situation entstehen, da zwei aufeinanderfolgende Kanten rot werden. Ist dies nicht vermeidbar, so mu gema obigem Schema rebalanciert werden. Satz: Die Tiefe eines Rot-Schwarz-Baumes mit n Blattern ist O(log n) Beweis: Siehe U bungsblatt. 3 Korollar: Die Worterbuch-Operationen benotigen auf Rot-Schwarz-Baumen O(log n) Zeit. KAPITEL 1. HOHERE DATENSTRUKTUREN 18 1.3 Binare Suchbaume 1.3.1 Naturliche binare Suchbaume Denition: Ein naturlicher binarer Suchbaum uber einem durch geordneten Universum U ist ein interner Binarbaum (Schlussel an den internen Knoten). Sortierungsbedingung: (Alle Schlussel im l. UB von v) Key(v) (Alle Schlussel im r. UB von v) ; ; 5m m 2 @ @ J J mHH 8 HH ; m m 11 m ; 6 10 @ @ m 13 m 3m 1 Lemma: Die In-Order-Linialisierung eines binaren Suchbaumes mit obigen Suchwegbedingungen ergibt eine aufsteigende Folge von Schlusselwertern. Operationen: IsElement(K T ): v ist Wurzel while ( = Blatt) do if Key( ) = then return (Val( )) elseif Key( ) then :=rechtes Kind von else :=linkes Kind von fi od v6 v v K v K v v K v Insert(K T ): Fuhre IsElement(K T ) aus Sei K nicht enthalten, dann fuhrt IsElement zu Blatt w (NIL-Pointer) Fuge man Knoten v mit Key(v) = K an Blatt w ein Delete(K T ): Fuhre IsElement(K T ) aus. Sei K enthalten, dann fuhrt IsElement zu Knoten w (i.a. interne Knoten). Ersetze w durch seinen in-order-Vorganger oder -Nachfolger. Problem: Lineare Entartung von naturli- @ @ R chen binaren Suchbaumen bei Einfugen in eine monotone Reihenfolge ) Insert, Delete, IsElement in worst-case O(n). Falls aber ; @ ; @ die Sclussel in zufalliger Reihenfolge eingefugt werden ) j E(h) - O(log n)j. Falls ; @ ; @ alle topologische (von der Form her gleichaussehende) Baume ; @ ; @ p gleichwahrscheinlich sind ) j E(h) - ( n)j. m m m KAPITEL 1. HOHERE DATENSTRUKTUREN 19 1.3.2 Hohenbalancierte binare Suchbaume (AVL-Baume) Denition: Ein AVL-Baum 1 ist ein spezieller binarer Suchbaum, der neben den Sortierungsbedingungen auch die folgende Hohenbalancierungen erfullt. Fur den Knoten v gilt: j Hohe(lUBv ) - Hohe(rUBv ) j 1 Lemma: Ein AVL-Baum der Hohe h hat mindestens nh = Fib(h + 2) Blatter. Beweis: Induktion nach h: I) h = 1 ) nh = 2 = Fib(3) h = 2 ) nh = 3 = Fib(4) k k S S S S k S S II) h 3 ) nh nh;1 + nh;2 Bei einem bzgl. der Blatterzahl minimalen AVL-Baum der Hohe h darf nur einer der Unterbaume der Hohe h ; 1 haben. Der andere mu kurzer sein, aber wegen der Balancierungsbedingung mindestens Hohe h ; 2 haben. Beide sind naturlich minimale AVL-Baume. Also gilt nh = nh;1 + nh;2 . Dies ist genau die Bestimmungsgleichung fur Fib(h + 1). k ; @ ; A A A A h;2 h;1 3 Folgerung: AVL-Baume der Hohe h haben mindestens Fib(h + 2) Blatter, also Fib(h + 2) ; 1 interne Knoten. p n Da anderseits gilt: Fib(n) p15 1+2 5 , hat ein AVL-Baum mit n-Blattern (oder interne Knoten) die Hohe O(log n). Dies ist ein bedeutender Fortschritt gegenuber der bisweilen bei naturlichen Suchbaumen entstehenden Zeitkomplexitat von (n) fur die Suchoperation IsElement. Operationen auf AVL-Baumen: 1. IsElement : Diese Operation wird wie bei den naturlichen Suchbaumen implementiert. Wie oben ausgefuhrt, haben aber AVL-Baume mit n Datenelementen eine Hohe von O(log n), woraus logarithmische Zeit fur das Suchen folgt. 2. Insert : Zunachst wird eine IsElement -Operation ausgefuhrt, die fur den Fall, da das einzufugende Element nicht bereits enthalten ist, zu einem Blatt fuhrt. Dies ist die Stelle, an der das neue Element einzufugen ist. Dabei ergeben sich 1 Benannt nach Adelson, Velskii und Landis KAPITEL 1. HOHERE DATENSTRUKTUREN 20 2 Falle: 1. Fall: x! m Balance +1 ; @ ; @ m A A ) m Balance 0 ; @ @ ; xm m A A A A (Balance ;1 ! 0: symmetrisch) 2. Fall: x! ) m Balance 0 ; @ ; @ xm m Balance ;1 ; @ @ ; A A Hier ist eventuell eine Rebalancierung auf dem Pfad zur Wurzel notwendig, denn die Hohe eines Unterbaums andert sich derart, da die Balance nicht zu 0 wird, sondern zu +1 oder ;1. Zur Rebalancierung (T1 T2 T3 T4 ): Fall 2-a) m m q s PPP p ;Balance 1 ! ;2 B B ; @ ; @ T3 B h;1 B B B B T1 B T2 B s h;1!h s ) h;1 m p Balance 0 m PP P q D ; @ D ; @ D B B D B B T1 D T2 B T3 B s s h;1 h s h;1 Fall 2-b) m r Balance ;1 ! ;2 m @ p @ ; @ @ ; @ @ q B B B A B T1 B A T4 B h;1 h;1 B B B B T2 B T3 B s s m s s ) m m q Balance 0 m PPP p r A A A A B B B B B B B T3 B B h ; 2 T4 B T1 B T2 B s s h;1 h;1 s s h;1 h;2! h;1 h;2 3. Delete : Auch diese Operation wird wie bei naturlichen Suchbaumen implementiert. Doch am Ende hat ggf. noch eine Rebalancierung auf dem Pfad KAPITEL 1. HOHERE DATENSTRUKTUREN 21 vom geloschten Blatt (das an die Stelle des zu loschenden Elements geschrieben wird) zur Wurzel zu erfolgen. Satz: Bei AVL-Baumen sind die Operationen IsElement, Insert, und Delete so implementiert, da sie die Zeitkomplexitat O(log n) haben, wobei n die Anzahl der Datenelemente (oder die Anzahl der Blatter) ist. Siehe auch: Aho, Hopcroft, Ullmann Sedgewick/Flajolet Info IV Skript SS94, Prof. Mayr In der Theorie: Sehr schone Eigenschaften. In der Praxis: Sehr aufwendig zu implementieren. 1.4 Hashing 1.4.1 Grundlagen Zutaten: Universum U von Schlusseln Schlusselmenge K M array T 0::m ; 1] Hashtabelle Hashfunktion h : U ! 0::m ; 1] Hash-Tabelle 0 - - pp p m;1 - pp p Problemstellung: Gegeben sei eine Menge M von Elementen, von denen jedes durch einen Schlussel k aus der Menge K bezeichnet sei. Die Problemstellung ist nicht neu: Wie mu die Speicherung der Elemente aus M organisiert werden, damit jedes anhand eines Schlussels moglich schnell lokalisiert werden kann? Gesucht ist also eine Abbildung h : K ! T von der Menge aller Schlussel in Adressraum T der Maschine. Hierbei soll jedoch eine bisher nicht beachtete Schwierigkeit berucksichtigt werden: Die Menge K der moglischen Schlusselwerte ist wesentlisch gro er als der Adre raum. Folglich kann die Abbildung h nicht injektiv sein, es gibt Schlussel k1 k2 :: mit h(k1 ) = h(k2 ) = : : : . Wir werden sehen, da aufgrund dieses Umstandes die Speicherstelle eines Elements mit Schlussel k von einem anderen Element mit einem anderen Schlussel l besetzt sein kann (Kollision). Zwei Methoden zur Kollisionsauosung: Chaining (Verkettung) Oene Adressierung 1.4.2 Chainingverfahren Die Hashtabelle ist eine array von m linearen Listen, wobei die i-te Liste alle k Schlussel beinhaltet, fur die gilt: h(k) = i KAPITEL 1. HOHERE DATENSTRUKTUREN 22 Zugri: Berechne h(k) und durchsuche die Liste T h(k)]. h(k1 k2 ) = h(k1 S ) := 1 falls h(k1 ) = h(k2 ) ^ k1 6= k2 0 sonst X k2 2S h (k1 k2 ) Anzahl Kollisionen von k1 mit S Zugriskosten : O(1 + h(k S )) worst-case: hjs = const ) Entartung des Hashings zu linearer Suche O(jS j) average-case : - Moge h das Universum U uber 0::m ; 1] gleichverteilen - Seien alle Werte in U gleichwahrscheinlich als Argument von Access(), Insert(), Delete() - Sei = mn der maximale Fullgrad von T , n = Anzahl Operationen Dann: Die erwartete Laufzeit fur n-Operationen = O (1 + 2 )n Beweis: Durch die Gleichverteilung fur den Wert h(ki ) bei der i-ten Operation P (h(k) = j ) = m1 (0 j m ; 1) ) E (Listenlange) mr nach der r-ten Operation ) E (Kosten von (n + 1)-ten Operationen) = O(1 + mi ) ) E (Kosten von n Operationen) = O((1 + 21 mn )n) 3 1.4.3 Hashing mit o ener Adressierung Beispiele: Lineares Sondieren (linear Probing) Quadratisches Sondieren Double Hashing Robin-Hood-Hashing ::: Bei dieser Methode werden die Elemente nicht in der Liste, sondern direkt in der Hash-Tabelle gespeichert. Wird bei Insert oder IsElement, angewendet auf Schlussel k, ein Element mit Schlussel 6= k an der Adresse h(k) gefunden, so wird auf deterministische Weise eine alternative Adresse berechnet. Fur jeden Schlussel k 2 U wird somit eine Reihenfolge (Sondierungsfolge), in der alle slots in T ] betrachtet werden, um k zu speichern bzw. zu nden, festgelegt. Dieser Vorgang hei t sondieren. KAPITEL 1. HOHERE DATENSTRUKTUREN 23 Sondieren: Sei s(j k) : 0::m ; 1] U ! 0::m ; 1] (0 j m ; 1) Deniere h(j k) = (h(k) ; s(j k)) mod m Starte mit h(k), dann (falls (h(k)) belegt) Index (h(k) ; s(1 k)) mod m Problem: Sei h(k) = h(k0) fur 2 Schlussel k k0 2 S U . Werde zunachst k eingefugt, dann k0 , dann k geloscht. Wie ndet man k0 (Beachte: k0 steht nicht unmittelbar an h(k0 ))? Losungsvorschlag: Markiere k als geloscht! Wenn Speicher gebraucht wird, k uberschreiben. Alternativ: Hashtabelle neu aufbauen/uberarbeiten. Beispiele fur Sondierungen: Lineares Sondieren: Setze s(j k) = j d.h. sondiere gema h(k) h(k);1 : : : 0 m; 1 :: h(k) + 1 Es wird fur IsElement solange ruckwarts gesucht, bis entweder das Element mit Schlussel k oder eine freie Position gefunden ist. Im letzteren Fall ist das gesuchte Element nicht in der Hash-Tabelle enthalten. Problem: Es entstehen primare Haufungen (primary Clustering) um diejenigen Schlussel herum, die beim Einfugen eine Kollision hervorgerufen haben. Satz: Die durchschnittliche Anzahl der Sondierungen ist : E(# 8 < 1 Sondierungsschritte) = : 21 2 1 + (1;1 ) erfolgreich 1 + (1;1)2 erfolglos erfolgreich erfolglos 0.5 0.9 0.95 1.5 5.5 10.5 2.5 50.5 200.5 Quadratisches Sondieren Setze s(j k) = (;1)j d 2j e2 , d.h. sondiere nach h(k) h(k) + 1 h(k) ; 1 h(k) + 4 h(k) ; 4 : : : Frage: Ist das uberhaupt eine Permutation von 0::m ; 1]? Ist s(j k) geeignet alle slots zu erreichen? Man kann zeigen, da fur ein primes m von der Form 4i + 3 die Sondierungsgro e (h(k) ; s(j k)) mod m Permutation von 0::m ; 1] ist. Satz: Die durchschnittliche Anzahl der Sondierungen ist : 8 < E(# Sondierungsschritte) = : 1 + ln 1;1 ; 2 erfolgreich 1 1 erfolglos 1; ; + ln 1; erfolgreich erfolglos 0.5 0.9 0.95 1.44 2.85 3.52 2.19 11.4 22.05 KAPITEL 1. HOHERE DATENSTRUKTUREN 24 Double Hashing Setze s(j k) = jh0 (k), wobei h0 eine zweite Hashfunktion ist. h0 (k) mu relativ prim zu m gewahlt werden, damit (h(k) ; s(j k)) mod m eine Permutation der Hashadressen wird. Satz: Die durchschnittliche Anzahl der Sondierungen ist : E(# Sondierungsschritte) = 1 1 1m 1; erfolgreich erfolglos 1; erfolgreich erfolglos 0.5 0.9 0.95 1.39 2.55 3.15 2 10 20 Zum Beispiel: h0 (k) = 1 + k mod n ; 2 (mit n prim). 1.4.4 Universelles Hashing Wir denieren eine Klasse H von geeigneten Hashfunktionen und wahlen eine spezielle Hashfunktin zufallig aus H aus. Dabei soll fur jedes S U \fast jedes\ h 2 H die Schlusselmenge S \fast\ gleichverteilen uber 0::m ; 1]. Formal: Denition: H hei t c-universell (c 2 R) g.d.w. 8k1 k2 2 U gilt: jf h 2 H j h (k1 k2 ) = 1gj c jH j m Satz: Sei H eine c-universelle Klasse von Hash-Funktionen, und sei h 2 H zufallig und gleichverteilt gewahlt. Wird Chaining verwendet, dann ist die erwartete Zeit fur Access(), Insert() und Delete() gleich O(1 + c ) Beispiel einer 4-universellen Hashtabelle: Seien N 2 N prim, m 2 N, und 8a b 2 0::N ; 1] : hab(k) = ((ak + b) mod N ) mod m 8k 2 U 0::N ; 1] Dann ist H = fhab j 0 a b N ; 1g 4-universell. 1.4.5 Perfektes Hashing Fur das statische dictionary problem (nur Access()) konnen wir denieren: Eine Hash-Funktion h ist \perfekt\ fur S U gdw. fur alle Paare von verschiedenen Schlussel, also 8k1 k2 2 S gilt: h (k1 k2 ) = 0, also h(k1 ) 6= h(k2 ). Eine minimale perfekte Hash-Funktion braucht nur den Platz m = jS j = n. Fur m 3n kann man in Zeit O(nN ) eine perfekte Hash-Funktion fur S U nden, die in O(1) Zeit auszuwerten ist (durch ein Programm der Gro e O(n log N )) Bits. Bisher bestes Resultat: Programmgro e O(n log log n + log log N) 2 n (untere Schranke: m + log log N ) KAPITEL 1. HOHERE DATENSTRUKTUREN 25 1.5 Priority Queues Operationen: Insert(), Delete(), DeleteMin(), FindMin(), DecreaseKey(), Merge() Implementierungen: Binomial Queues Fibonacci Heaps 1.5.1 Binomial Queues (binomial heaps) Um binomial Queues betrachten zu konnen, denieren wir zunachst ihre nichttrivialen Bestandteile: Binomialbaume Denition: Die Binomialbaume sind rekursive wie folgt deniert: B0 B B sm m s1 A2sm s s As s Bn sm ;@ ;Bn;1@ ;@ ;Bn;1@ s Achtung: Binomialbaume sind keine Binarbaume! Wie in folgender Darstellung dieser Baume deutlich wird, hat Bn an der Wurzel Grad n. Binomialbaume haben folgende Zerlegungseigenschaften: Lemma: Ein Bn la t sich wie folgt zerlegen: s #c # c (1) # c # c # c ;@ ;@ ;@ ; Bn;1@ ; Bn;2@ ; Bn;3@ s s s q q q q ;s@ ; B1 @ (2) s ;@ ; B0 @ s @ ; Bn;1@ ; Ruckgrat XXX @ z; X ; Bn;2@ ;@ Bn;3@ @ ; ; B1 @ ; sB0 sB0 pp psp p p p p p p s s KAPITEL 1. HOHERE DATENSTRUKTUREN 26 Satz: Es gilt: 1. 2. 3. 4. Bn hat 2n Knoten. Die Wurzel von Bn hat Grad n Bn hat Hohe n ; Bn hat ni Knoten in Tiefe i Beweis: zu 1: Induktion unter Verwendung der Denition von Binomialbaumen zu 2: Siehe Zerlegung (1) fur Binomialbaume zu 3: Siehe Zerlegung (2) fur Binomialbaume zu 4: Induktion uber n: I) ;n = 0 : B0 hat 1 Knoten in Tiefe i = 0 und 0 Knoten in Tiefe i > 0, also 0 Knoten in Tiefe i i II) Ist Nin die Anzahl der Knoten in Tiefe i in Bn , so gilt unter der entsprechenden Induktionsannahme ur Bn , da ; ;f Nin+1 = Nin + Nin;1 = ni + i;n1 3 Bemerkung: Eine mogliche Implementierung von Binomialbaumen ist das Schema \Pointer zu Kind 1. und zum nachsten Geschwister\. Denition: Eine Binomial Queue mit N Elementen wird wie folgt aufgebaut: 1. Betrachte die Binardarstellung bin(N ) von N 2. Fur jedes gesetzte Bit (\1\) an Position i wird ein Binomialbaum vom Type Bi benotigt. Dieser hat bekanntlich 2i Knoten 3. Verbinde die Binomialbaume in einer doppelt verketteten zirkularen Liste. 4. Beachte, da innerhalb jedes Binomialbaums die Minimumsvariante der Heap-Bedingung, namlich VATERSOHN erfullt sein mu . Dadurch ist die Wurzel eines einzelnen Binomialbaums gleichzeitig sein minimales Element. 5. Richte einen Min-Pointer auf das Element in der Wurzel-Liste mit minimalem Schlussel. Es ist dann das kleinste Element von allen in der Binomial Queue Beachte, da Priority-Queues wegen O(n) fur Suchen keine Suchstrukturen sind. KAPITEL 1. HOHERE DATENSTRUKTUREN 27 Beispiel: N = 11 = (1011)2: B3 m 7 2m Y Q Q Q m m m 3 8 10 A A A A 4m 11m 9m - B1 j B0 m I @ @ m 6 min m 7 1 Operationen: 1. IsElement : Die Heap-Bedingung wirkt sich nur auf die Anordnung der Datenelemente innerhalb jedes einzelnen Binomialbaums aus, regelt aber nicht, in welchem Binomialbaum ein gegebenes Element gespeichert sein mu . Tatsachlich kann ein Element in jedem der vorhandenen Binomialbaume stehen. Das Suchen ist hier nicht e"zient implementierbar, denn im worst-case mu jedes Element eines Binomialbaums angeschaut werden. Bi enthalt 2i Knoten und eine Binomial Queue mit N Elementen besitzt maximal die Binomialbaume B0 B1 ::Blog N ;1 . Also waren zum Suchen eines Elements schlimmstenfalls 20 + 21 + + 2log N ;1 = N ; 1 = O(N ) Elemente zu betrachten. Daher wird eine gesonderte Datenstruktur, etwa ein Suchbaum, fur die IsElement Operation verwendet. Dort ist Suchen mit Zeitaufwand O(log n) moglich. 2. Merge : Das Vorgehen fur das Merge zweier Vorrangwarteschlangen entspricht genau der Addition zweier Binarzahlen: Ein einzelnes Bi wird ubernommen, aus zwei Bi s wird ein Bi+1 konstruiert. Damit die Heap-Bedingung erhalten bleibt, wird als Wurzel des entstehenden Binomialbaums Bi+1 die kleinere der Wurzeln der beiden Bi genommen (*). Allerdings kann ein solcher U bertrag dazu fuhren, da im nachsten Verschmelzungsschritt drei Bi+1 zu verschmelzen sind. Dann wird unter Beobachtung obiger Regel ein Bi+2 gebildet, und der verbleibende Bi+1 unverandert gelassen. Algorithmus: for i := 0 1 2 3 :: do genau 3 i s) then erzeuge/verbinde i+1 nach (*) und behalte ein elseif ( genau 2 i s) then erzeuge i+1 nach (*) elsif ( ein i ) then behalte es fi if (9 9 9 B B B B B Bi od Komplexitat: Binomial Queue Nr. 1 mit N1 Elementen hat log N1 Binomialbaume, und analog hat Binomial Queue Nr. 2 mit N2 Elementen log N2 Binomialbaume. Sei N := N1 + N2 . Ein einzelner Merge -Vorgang, das Zusammenhangen zweier Binomialbaume erfolgt in konstanter Zeit. Naturlich mu er so oft ausgefuhrt werden, wie Binomialbaume in der resultierenden Binomial Queue vorliegen. Diese Anzahl wiederum ist hochstens log N . KAPITEL 1. HOHERE DATENSTRUKTUREN 28 Zeitkomplexitat O(log N ) = O(log (N1 + N2 )) 3. Insert : Die Insert -Operation wird einfach durch Merge -Operation implementiert. Die Vorrangswarteschlange, die neu hinzukommt, ist trivial. Sie enthalt nur einen Binomialbaum B0 . 1 0 0 1 0 1 0 1 (B7 ) (B4 ) (B2 ) (B0 ) 1 1 0 0 1 0 1 1 1 Kosten O(log n) 4. Initialisierung einer Binomial-Queue durch N sukzessive Insert -Operationen: Kosten mit O(n log n) schlecht abgeschatzt. Dabei moge sowohl das Einfugen dieses neuen einelementigen Baum als auch jede rekursive Verschmelzungsschritt eine Zeiteinheit kosten, denn jede dieser Operationen ist von der Komplexitat O(1). Wir sind an den gesamten Kosten zum Aufbau einer Binomial Queue mit N Elementen interessiert. Dies sind ubrigens identisch zum Aufwand fur das binare Hochzahlen von 0 bis N , wenn jeder Zahlschritt und jeder U bertrag eine Zeiteinheit kosten: 0| {z + 1} +1 +1 +1 +1 1 {z } 2 Schritte {z } | 1 | {z } 3 {z | } 1 | Sei an die Anzahl der Schritte (Einfugen des neuen Elements und anschlie ende Verschmelzungen) beim Mergen eines Knotens zu einer Queue mit (n ; 1) Elementen. Dann gilt fur an : n an 1 ..4 ..8 ..16 ..32 2 1 1 1 1 3 2 1 4 2 1 3 1 2 1 5 2 1 3 1 2 1 4 1 2 1 3 1 2 1 6 Man erkennt sofort, da die h-te Zeile von der Lange 2k ist, und alle Elemente der Zeilen 1 2 :: (k ; 1) enthalt, wobei das letzte Element um eins erhoht ist. Daraus ergeben sich folgende Rekursionsgleichungen fur an : a1 = 1 an = a n2 + 1 fur n 2 2N0 an = an;2blog nc sonst KAPITEL 1. HOHERE DATENSTRUKTUREN 29 Diese Bestimmungsgleichung ist unmittelbar einsichtig, denn fur n 2 2N0 unterscheidet sich die Situation von n = 2i Knoten nur insofern von der Situation mit n2 = 2i;1 Knoten, da im ersten Fall noch ein Binomialbaum Bi;1 vorliegt. Das Hinzunehmen eines weiteren Knotens lost in beiden Fallen die selbe Folge von Verschmelzungsschritten aus, mit der Einschrankung, da im letzteren Fall der neu entstandenen Baum Bi;1 mit dem vorhandenen zu einem Bi vereinigt wird. Das ist die \+1\ in an = a n2 + 1. Im Falle n 62 2N0 liegen ahnliche Verhaltnisse vor. Zwei Queues mit n bzw. (n ; 2blog nc ) Knoten unterscheiden sich nur um einen Baum Bblog nc . Gesucht ist nun Sn := nk=1 ak . Statt obige Rekursionsgleichungen zu expandieren und eine explizite Darstellung fur an zu suchen, die dann aufsummiert wird, betrachten wir einfach S2k . Obiger Tabelle sieht man an, da S2k = S2k;1 +1 gilt. Substituiert man S2k durch Tk und lost man die entstehene Rekursionsgleichung Tk = 2Tk;1 + 1, so ergibt sich Tk = 2k+1 ; 1, also Sn = 2n ; 1. Folglich ist: SN = O(N ) 5. FindMin: Diese Operation ist trivial ausfuhrbar, denn es ist ein Pointer auf das minimale Element gegeben. Daher ist auch die Zeitkomplexitat O(1). 6. DeleteMin:Das Minimum ist auf Grund der Heapbedingung Wurzel eines Binomialbaums Bk in der Liste. Wird es geloscht, so zerfallt der Binomialbaum in k Teilbaume B0 B1 : : : Bk;1 r A Brk r A @; ; @ A A A A AA AA AA rA q q q q &(k-Kinder) A AA B0 B1 : : : Bk;1 Die Teilbaume B0 B1 : : : Bk;1 sind alle zur verbleibenden Queue zu mergen. Au erdem mu der Min-Pointer aktualisiert werden. Der Zeitaufwand fur DeleteMin-Operation ist: O(log N ) 7. Delete : Losche Knoten x: 1-Fall) x ist min-Wurzel: s.o. 2-Fall) x ist eine andere Wurzel in der Wurzelliste. Analog zu oben, ohne den Min-Pointer zu aktualisieren. 3-Fall) x sei nicht Wurzel eines Baumes: Angenommen, x ist in Baum Bi enthalten: KAPITEL 1. HOHERE DATENSTRUKTUREN 30 Bp pkp p p p p p ;is@p p p p p p p p p p p p s; Bk;1@p p p p p p p p p p pp pp ps ;;Bk@;2@ p p p p p p p p p p p p p ppspp pp p p p;p p ;Bk@;3@ p p p p p p p p p p p p p pspp pp p p ;;Bi@+1@ p p p p p p p p p (Bp i+1 (II) : : : Bk;1 ) p p p @ p p ; (I) p p p sp p pp ;;;@;B@@i @p p p p p p p p (Bi )p p p p p p p p p p p p psp p p p p p;;Bi@;1@p p p p - (III) (B ohne x) p p p p p i p pp pp p ;;B@0 @ p p p p p p p p p ppp pppppp pp ppp Im Fall-3 mu unterschieden werden: 3a) x ist Wurzel: sx A B0 ,B1 : :A: ,Bi;1 A A Siehe (2-Fall) 3b) x ist in Wurzel des Bi : Bi s s A A xA A Bi So lange 3-te Fall wiederholen (Rekursiv), bis Fall-3a) eintritt Insgesamt mu die Binomial-Queue ohne Bi mit einer aus B0 BN ;1 bestehenden Binomial-Queue vereinigt werden. Zeit O(log N ) 8. DecreaseKey : Verkleinere Key(x) 1-Fall) x ist die min-Wurzel: keine Strukturanderung notig 2-Fall) x ist eine andere Wurzel: keine Strukturanderung notig 3-Fall) Sonst wie Delete(x), aber einfugen des Baumes mit Wurzel x und den neuen Key(x) in die Wurzelliste. Kosten O(log n) Satz: Binomial-Queues haben fur die Operationen Insert, Delete, DeleteMin, FindMin, Merge und Initialize worst-case-Kosten von jeweils O(log n). KAPITEL 1. HOHERE DATENSTRUKTUREN 31 1.5.2 Fibonacci-Heaps Vorbemerkungen: Fibonacci-Heaps stellen eine Erweiterung der Binomial-Queues dar und eine weitere Moglichkeit zur Implementierung von Heaps. Die amortisierten Kosten fur die Operationen Delete() und DeleteMin() betragen hierbei O(log n), die fur alle anderen Heap-Operationen lediglich O(1). Naturlich konnen die worstcase-Kosten fur (n Insert ) + (n DeleteMin) nicht unter (n log n) liegen, denn diese Operationen zusammengenommen stellen einen Sortieralgorithmus dar mit unterer Schranke (n log n). Die Verwendung von Fibonacci-Heaps erlaubt eine Verbesserung der Komplexitat der Algorithmen fur die minimale Spannbaume sowie fur Dijkstra's kurzeste-Wege-Algorithmus, denn diese verwenden relativ haug die DecreaseKey -Operation, welche durch Fibonacci-Heaps billig zu implementieren ist. Bei einem Algorithmus, bei dem die Delete - und DeleteMin-Operationen nur einen geringen Anteil der Gesamtoperationen darstellen, sind Fibonacci-Heaps asymptotisch schneller als die Binomial-Queues. Bemerkungen: Priority-Queues eignen sich grundsatzlich nicht fur Suchoperationen, unabhangig von ihrer Implementierung. Es ist daher immer eine zusatzliche Datenstruktur, etwa ein Suchbaum, zu verwenden. Jedes Element besteht aus einem Schlussel (key) und einem Wert. Der Schlussel darf in einer Priority-Queue nur einmal vorkommen. Es ist jedoch zulassig, da derselbe Datenwert mehreren verschiedenen Schlusseln zugeordnet ist. Fur die folgenden Betrachtungen sind gespeicherte Werte aber uninteressant, es werden nur die Schlussel betrachtet. 1.5.2.1 Die Datenstruktur Die Schlussel sind an den Knoten von Baumen gespeichert Jeder Knoten hat { Schlussel und Wert { Rang (Anzahl der Kinder) { Zeiger zum ersten Kind, zum Vater (NIL im Falle der Wurzel), doppelt verkettete Liste der Kinder { Markierung 2 f0 1g (au er Wurzel) Bemerkung: Die doppelte Verkettung der Kinder- bzw. Wurzellisten innerhalb von Heaps erlaubt das Loschen eines Listeneintrages in Zeit O(1). Binomial-Queue vs. Fibonacci-Heap: Fibonacci-Heaps: Wald von Baumen, innerhalb derer die Heap-Bedingungen erfullt sind. A-Priori: Keine Einschrankung fur die Topologie der Baume, aber ohne Delete oder DekreaseKey-Operation bleibt ein Binomialwald ein Binomialwald. keine Invariante der Form \Nur Baume verschiedenen Wurzel-Rangs\. KAPITEL 1. HOHERE DATENSTRUKTUREN U berblick: 32 Operationen worst case amortisiert Insert O(1) O(1) Merge O(1) O(1) FindMin O(1) O(1) DecreaseKey O(log n) O(1) Delete O(log n) O(log n) DeleteMin O(n) O(log n) Linken von Baumen: Zwei Baume desselben Wurzel-Rangs werden unter Einhaltung der Heap-Bedingung verbunden. Sind k1 und k2 die Wurzeln der zwei zu linkenden Baume, so wird ein neuer Baum aufgebaut, dessen Wurzel bzgl. der Schlussel das Minimum von k1 und k2 ist. Sei dies k2 , dann erhalt der Baum mit Wurzel k2 als zusatzlichen Unterbaum den Baum mit Wurzel k1 , d.h. der Rang von k2 erhoht sich um eins. rk1 > k;2 r@ ;@ ; @ ; @ ) k2 r k1 r ;@ ; @ ;@ ; @ Dies ist gerade der konstruktive Schritt beim Aufbau von Binomialbaumen. Zur Verbesserung der amortisierten Zeitschranken sind zusatzlich folgende Regel Formuliert: Kaskadiertes Abschneiden: Ein Knoten ist im \Anfangszustand\, wenn i) er durch einen Linkschritt Kind eines anderen Knotens wird oder ii) er in die Wurzelliste eingefugt wird. Wenn ein Knoten ab seinem Anfangszustand zum zweitenmal einen Sohn verliert, wird er in die Wurzelliste eingefugt. Der kritische Zustand (ein Kind verloren) wird durch das Markierungsbit angezeigt. Algorithmus: x verliert Kind y = P (x) : (Vater von x) while (y markiert) do entferne y f uge y unmarkiert in die Liste if (P (y )=NIL) then exit fi y = P (y) od markiere ein y Operationen: 1. Insert(x): Fuge B (mit dem Element x) in die Wurzelliste ein. Update Min-Pointer. Kosten O(1) KAPITEL 1. HOHERE DATENSTRUKTUREN 33 2. Merge(): Verbinde beide Listen und aktualisiere den Min-Pointer. Kosten O(1) 3. FindMin(): Es wird das Element ausgegeben, auf das der Min-Pointer zeigt. Dabei handelt es sich sicher um eine Wurzel. Kosten O(1) 4. Delete(x) i) Falls x Min-Wurzel, DeleteMin-Operator benutzen ii) Sonst: while true do f uge Liste der Kinder in die Wurzelliste ein l osche , =Vater( ) if Markierung( )=0 then Markierung( )=1 exit else h ange samt Unterbaum in Wurzelliste entferne Markierung von da Wurzel = Vater( ) fi od x x x x x x x x x x 5. DeleteMin(): Diese Operation hat auch Aufraumfunktion und ist daher recht kostspielig. Sei x der Knoten, auf den der Min-Pointer zeigt: x :=" Min-Pointer x entferne aus der Liste Konkataniere Kinderliste vom mit der Wurzelliste while ( 2 B aume von selben Wurzel-Rang ) do erzeuge Baum vom Wurzel-Rang + 1 od update Min-Pointer 9 x i i Man beachte, da an jedem Knoten, insbesondere jeder Wurzel, der Rang gespeichert ist. Zwar vereinfacht dies die Implementierung, doch mussen noch immer Paare von Wurzeln gleichen Rangs gefunden werden. Dies wird wie folgt realisiert: Wir verwenden ein array, dessen Indizies je fur einen Rang stehen. Die Elemente sind Zeiger auf eine Wurzel dieses Rangs. Es ist garantiert, da ein Element nur dann unbesetzt ist, wenn tatsachlich keine Wurzel entsprechenden Rangs existiert. Nach dem Entfernen des Knoten x aus der Wurzelliste fugen wir die Kinder eines nach dem anderen in die Wurzelliste ein und aktualisiern in jedem Schritt das array. Soll eine bereits besetzte Position des arrays beschrieben werden, so wird ein Link-Schritt ausgefuhrt und versucht, einen Pointer auf die neue Wurzel in die nachsthohere Position im array zu schreiben. Dies zieht evtl. weitere Link-Schritte nach sich. Nach Abschlu dieser Operation enthalt die Fibonacci-Heap nur verschiedene Baume. Liegt der kanonische Fall vor, da ausschlie lich Binomialbaume im Spiel sind, so erhalten wir durch DeleteMin-Operation eine Binomial-Queue. Zeitkomplexitat fur DeleteMin: O(max Rang + # Link-Schritte) KAPITEL 1. HOHERE DATENSTRUKTUREN 34 6. DecreaseKey(K $): x entferne = ( ) f uge unmittelbar in die Wurzelliste ein Key( ) := Key( ) - $ while ( markiert) do entferne f uge unmarkiert in die Wurzelliste ein if ( ( ) =NILL) then exit fi = ( ) od markiere y Px x x x y y Py y Py y y Zeitkomplexitat: O(max Hohe) Bemerkung: Wird mit einem leeren oder gar keinem Fibonacci-Heap gestartet, und werden ausschlie lich die aufbauenden Operationen Insert, Merge und FindMin angewendet, so konnen nur Binomialbaume enstehen. In diesem naturlichen Fall also liegt stets ein Binomialwald vor, der jedoch i.a. nicht aufgeraumt ist. Das hei t, es existieren mehrere Binomialbaume Bi desselben Typs, die nicht paarweise zu Bi+1 -Baumen verschmolzen sind. Dies geschieht erst bei der Operation DeleteMin. Man beachte, da nur nach einer solchen Operation momentan ein Binomial Heap vorliegt, ansonsten nur ein Binomialwald. 1.5.2.2 Amortisierte Kostenanalyse fur Fibonacci-Heaps Kostenanalyse fur Operation Sequenzen: i) Summieren der worst-case-Kosten ware zu pessimistisch. Der resultierende Wert ist i.a. zu gro . ii) average-case: - Aufwand fur Analyse zu hoch - realistische Verteilung fur Eingabe? iii) amortisierte Kostenanalyse: average-case-Analyse uber worst-case-Sequenzen von Operationen. Denition: Wir fuhren fur jede Datenstruktur (Fibonacci-Heap) ein Bankkonto ein und ordnen ihr eine nichtnegative reelle Zahl bal, ihr Potential (bzw. Kontostand) zu. Die amortisierten Kosten fur eine Operation ergeben sich als Summe der tatsachlichen Kosten und der Veranderung des Potentials ($bal), welche durch die Operation verursacht wird: ti := worst-case-Kosten der i-ten Operation $bali = bali ; bali;1 : Potentialveranderung durch die i-te Operation. ai = ti + $bali : \amortisierte Kosten\ der i-ten Operation m : Anzahl der Operationen Falls balm bal0 (Was bei bal0 := 0 stets gilt): m X i=1 ai = m X m X i=1 i=1 (ti + $bal) = ti + balm ; bal0 m X i=1 ti KAPITEL 1. HOHERE DATENSTRUKTUREN 35 Amortisierten Kosten einer Sequenz sind obere Schranke fur die tatsachlicher Kosten. Anwendung auf Fibonacci-Heaps: bal := # Baume + 2#(markierte Knoten 6= Wurzel) Lemma: Sei x ein Knoten im Fibonacci-Heap mit Rang(x) = k. Seien die Kinder von x sortiert in der Reihenfolge ihres Anfugens an x, dann ist der Rang des i-ten Kindes i ; 2. Beweis: Zum Zeitpunkt des Einfugens des i-ten Kindes ist der Rang(x) = i ; 1 (Das i-tes Kind hat zu dieser Zeit auch Rang (i ; 1)). Danach kann das i-te Kind hochstens einen Sohn verloren haben ) Rang i ; 2. 3 Satz: Sei x Wurzel eines Baums im Fibonacci-Heap, Rang( x) = k. Dann enthalt P der Baum mit Wurzel x mind. Fk+2 Elemente (Fk+2 = ki=2 Fi + 2). (D.h., die Wurzelrange sind logarithmisch beschrankt). Beweis: Sei fk die minimale Anzahl der Elemente im Baum, dessen Wurzel Rang k hat. ) fk fk;2 + fk;3 + : : : + f0 + 1 + 1 Setze: gk := gk;2 + gk;3 + : : : + g0 + 2, d. h. fk gk g0 := 1 (1) gk = gk;2 + gk;3 + : : : (2) gk;1 = gk;3 + gk;4 + : : : (1) - (2) gk ; gk;1 = gk;2 ) gk = gk;1 + gk;2 ) fk gk = Fk+2 pp 3 Amortisierte Kosten der FH-Operationen (ai = ti + $bali): FindMin: a = t = O(1). Insert : t = O(1) $bal = +1 ) a = O(1). Merge : t = O(1) $bal = 0 ) a = O(1). DeleteMin: 9 Einfugen der Kinder von x in Wurzelliste: > > > > $bal = Rang(x) > > Jeder Link-Schritt verkleinert # Baume um 1 = ) a = O(log N ) $bal = ;1 > > > ) Jeder Link-Schritt wird von Bankkonto > > > bezahlt und verschwindet amortisiert DecreaseKey : Es ist $bal = 3 ; (# kaskadierte Schritte) Jeder Schritt erhoht die # der Baume um 1 bal+ = 1 Jeder Schritt vernichtet eine Markierung bal; = 2 Der letzte Schritt erzeugt eine Markierung bal+ = 2 Literatur: 9 > > > > > > = > > > > > > ) a = O(1) Fredman, Tergen: Fibonacci-Heaps and their uses in improved network optimization algorithmus, Procceedings of the 25th., FOCS, 1984, S. 338-346 KAPITEL 1. HOHERE DATENSTRUKTUREN 36 1.6 Sich selbst organisierende Datenstrukturen 1.6.1 Motivation einfach, wenig Verwaltungsoverhead e"zient im amortisierten Sinn 1.6.2 Sich selbst organisierende lineare Listen Beim sog. \Worterbuchproblem\ ist auf moglichst e"ziente Weise eine Menge von bis zu n Elementen zu organisieren: Einfugen Loschen Reihenfolge andern Dabei soll die E"zienz der Implementierung bei beliebigen Sequenzen von m Operationen untersucht werden. Die Menge wird als unsortierte Liste dargestellt. s ? - s - s - ppppppppp - s Operationen: 1. Access(i): Suchen des Elements i: Die Liste wird von Anfang an durchsucht, bis das gesuchte Element gefunden ist. Fur das i-te Element betragen die tatsachlichen Kosten i Einheiten. 2. Insert(i): Einfugen des Elements i: Die Liste wird von Anfang an durchsucht, und wenn sie vollstandig durchsucht wurde und das Element nicht enthalten ist, so wird es hinten angefugt. Diese erfordet (i + 1) Schritte, wenn die Lange der Liste i ist. 3. Delete(i): Loschen des Elements i: Wie bei Access wird die Liste zuerst durchsucht und dann das betreende Element geloscht. Diese kostet im Falle des i-ten Elements i Schritte. Nach Abschlu einer jeden Operation konnen gewisse Umordnungsschritte stattnden, die spatere Operationen beschleunigen. Annahme: Wir nehmen an, da nach Ausfuhrung jeder Access - oder Insert -Operation, die auf Element i angewandt wird, dieses Element kostenlos um beliebig viele Positionen in Richtung Listenanfang geschoben werden kann. Wir nennen jede daran beteiligte Elementenvertauschung einen kostenlosen Tausch. Jeder andere Tausch zweier Elemente ist ein bezahlter Tausch und kostet eine Zeiteinheit. Ziel: Es soll eine einfache Regel gefunden werden, durch die mittels obiger Ver- tauschungen die Liste so organisiert wird, da die Gesamtkosten einer Folge von Operationen minimiert werden. Wir sprechen von \selbstorganisierenden linearen Listen\ und untersuchen hierzu folgende Regeln: MFR (Move-to-Front-Rule): Access und Insert stellen das betreende Element vorne an die Liste an und verandern ansonsten nichts. TR (Transposition-Rule): Access bringt das Element durch eine Vertauschung um eine Position nach vorne, insert hangt es ans Ende der Liste an. KAPITEL 1. HOHERE DATENSTRUKTUREN 37 Bemerkung: - Die MFR erlaubt die Ausfuhrung einer Sequenz von Operationen Access, Insert und Delete mit einer amortisierten Laufzeit, die um hochstens den konstanten Faktor 2 schlechter ist als ein optimaler Listenalgorithmus. - Fur die TR dagegen gibt es keinen solchen konstanten Faktor. Sie kann verglichen mit MTR bzw. einem optimalen Algorithmus beliebig schlecht sein. Fur die Algorithmen nehmen wir an: 1. Kosten fur Access(xi ) und Delete(xi ) sind gleich der Position von xi in der Liste (von Anfang an gezahlt). 2. Kosten fur Insert(x) (x nicht in Liste) ist der Lange der Liste nach der Insert Operation (d.h. neue Elemente werden zunachst an Listenende) angehangt 3. Ein Algorithmus kann die Liste jederzeit umorganisieren (die Reihenfolge andern). (a) kostenlose Vertauschung: nach einer Access(x)- oder Insert(x)-Operation kann x beliebig naher an den Anfang der Liste verschoben werden. (b) bezahlte Vertauschung: jede andere Vertauschung benachbarter Listenelemente kostet eine Einheit. Bemerkung: MFR (und auch Transpose) benutzen nur kostenlose Vertauschungen. 3a ist pessimistisch fur MFR. Satz: Sei s eine beliebige Folge von Access, Insert und Delete Operationen, be- ginnend mit einer leeren Liste. Sei A ein beliebiger (optimaler) WorterbuchAlgorithmus mit obigen Einschrankungen. Sei CA (s) der Zeitaufwand von A auf s, ohne bezahlte Vertauschungen. Sei XA (s) die Anzahl der bezahlten Vertauschungen. Sei CMFR (s) der Gesamtaufwand der Move to front-Heuristik auf s. Sei FA (s) die Anzahl der kostenlosen Vertauschungen, die A auf s ausfuhrt. Sei m := jsj die Lange von s. Dann CMFR(s) 2 CA (s) + XA (s) ; FA (s) ; m Beweis: Potentialfunktion: LA bzw. LMFR seien die Listen, A bzw. MFR (fuhrt bei Eingabesequenz s) sind die Algorithmen. Potential := Anzahl der Inversionen in LMFR im Vergleich zu LA D.h. sei o.B.d.A. LA = (x1 x2 : : : xn ). Dann ist die Potential: bal(LMFR LA ) = n X j =1 jf i j > i und xj ist in LMFR vor xi gj Wir betrachten im folgenden Insert(x) als ein Access auf ein (ktives) (n + 1)-tes Element. Eine Operation (Access(xi ) bzw. Delete(xi )) kostet fur A dann i Einheiten und fur MFR t Einheiten, wobei t die Position von xi in LMFR ist. i) A andert (bei Access bzw. Delete ) LA in kanonischer Weise. Fur Element xi sind die Kosten i-Einheiten. KAPITEL 1. HOHERE DATENSTRUKTUREN 38 ii) Die amortisierten Kosten einer Operation (Access(xi ) oder Delete(xi )) fur MFR sind 2i ; 1 A: MFR : L L 1 x2 x : :x:i : : : xn : : : : : : : :x:j : : : xi ::: " t Sei k die Anzahl der Elemente (wie xj ), j > i, die im LMFR vor xi stehen. t ist die Position xi im LMFR: ti+k )k t;i $bal ;k + (i ; 1) i ; t + i ; 1 2i ; 1 ; t (bei Access) $bal = ;k i ; t (bei Delete ) Amortisierte Kosten t + $bal 2i ; 1. iii) Die amortisierten Kosten einer kostenlosen Vertauschung durch Algorithmus A sind ;1 A: LMFR : L +s 1 x2 : : : xi;1 xi : : : xn : : : xi : : : xi;1 : : : : : : x eine Inversion weniger iv) Die amortisierten Kosten einer bezahlten Vertauschung durch Algorithmus A sind 1 A: LMFR : L +s 1 x2 : : : xi;1 xi : : : xn : : : xi;1 : : : xi : : : : : : x plus eine Inversion Anfangspotential : 0 ) CMFR (s) amort. Kosten MFR 2 CA (s) + XA (s) ; FA (s) ; m 3 Anmerkung: Wenn wir nicht mit einer leeren Liste (oder zwei identischen Listen, d.h. LA = LMFR ) starten, ergibt sich: CMFR 2CA (s) + XA (s) ; FA (s) ; m + n2 Literatur: Sleator, D.R., Tarjan: Amortized e"ciency of list update and paging rules. Comm. ACM 28(2), p. 202-208 (1985). 1.6.2.1 Sich selbst organisierende Binary Keys Priority Queue Variante von Leftist-Baumen s.Knuth]: Ein Leftist-Baum ist ein (interner) binarer Suchbaum, so da fur jeden der Knoten gilt, da ein kurzester Weg zu einem Blatt uber das rechte Kind fuhrt. KAPITEL 1. HOHERE DATENSTRUKTUREN 39 Wir wollen folgende Operationen unterstutzen: - Insert - FindMin - DeleteMin - Delete - Merge 9 > > > > = > > > > alle Operationen lassen sich auf Merge zuruckfuhren Operationen: 1. Insert(T x): neuer Baum mit x als Element, merge diesen mit T p 2. FindMin: (Minimum an der Wurzel, wegen Heap-Bedingung) 3. DeleteMin: m @; ;@ ; @ ; @ A A T1A T2A q 4. Delete : q p pp p p mp(x) @; mx ;@ q;; @@qA A T1A T2A ) mergeq T1 undq T2 A A T1A T2A p ppmp p p(x) ) J J J merge(T1 T2 ) 5. Merge : Seien zwei Heaps H1 und H2 gegeben, seien a1 :: ar1 die Folge der Knoten in H1 von der Wurzel zum rechtesten Blatt, sei b1 :: br2 die entsprechende Folge in H2 . H1 H2 a1 b pp p p p s@@s a2 pp p p p s@1@s b2 p p pp p p @@p sp pp p p @@p sp p p p p p p p p pp p s p p p p pp p s p p p @@sar1 p p p @@sbr1 Sei c1 c2 :: cr1 +r2 die durch Merging aus (a1 :: ar1 ) und (b1 :: br2 ) entstehende (sortierte) Folge. Mache (c1 :: cr1 +r2 ) zum linkesten Pfad im neuen Baum und hange den jeweiligen anderen (d.h. linken) UB ai bzw. bj als rechten UB des entsprechenden ci an. KAPITEL 1. HOHERE DATENSTRUKTUREN 40 Beispiel: H1 ; ; m 9 A A H1 ; @ ; @ m 5 m 1 m 3 ; @ ; @ m 11 A A m m 4 m 6 10 A A m 8 ; ; m 7 m 2 ; @ ; @ A A ) A A m 4 A A 6m A A m 3 m 2 m 1 A A A A m 11 A A m 7 m 5 A A 8m Amortisierte Kostenanalyse der Merge-Operation: Sei w(x) := Gewicht von x = # Knoten im UB von x (einschlie lich x) xr J z r r J y J (x y) schwer ) (x z ) leicht Kante(x y) hei t leicht, falls 2:w(y) w(x) Kante(x y) hei t schwer, sonst Es gilt: Es ist immer ein Kind uber leichte, eins uber schwere Kante erreichbar. Beobachtungen: 1. (x y) schwer ) (x z ) leicht 2. Da sich uber eine leichte Kante das Gewicht mindestens halbiert, kann ein Pfad von der Wurzel zu einem Blatt hochstens log n leichte Kanten enthalten. Potential: # schwere Kanten zu rechten Kindern KAPITEL 1. HOHERE DATENSTRUKTUREN H1 n1 := jH1 j p p s a1 41 H2 n2 := jH2 j p p p s@b1 p p p @@6p p@s p p @@@@COp p@s p p p ;@p p @s p p p CC @p p s C pp @ ; @ Hp p p @p s Cp @p s @ leichte H H pp p@ C p H @ @ Kanten pp HH @H@p s p @p s C p j @ ppH C @ p XX p p -@ XXX @ p @p ps @p ps schwere Kanten XX z X pp -@@ p @@ p p p @ @ s @ @s br1 ar1 schwere Kanten s1 := # schwere Kanten auf den rechten Pfad. s2 := Analog. r1 s1 + log n1 r2 s2 + log n2 Amortisierte Kosten fur Merge: r1 + r2 + log(n1 + n2 ) ; s1 ; s2 log n1 + log n2 + log(n1 + n2 ) = O(log(n1 + n2 )) Satz: Eine Folge von m merge-Operationen benotigt Zeit: m X O( i=1 log(ni )) wobei ni die Gro e des Baumes ist, der in der i-ten merge-Operation geschaen wird. 1.6.2.2 Splay-Trees als Suchbaume 1.6.2.2.1 Einleitung Wie schon in fruheren Kapiteln sollen binare Suchbaume verwendet werden, um Elemente, bestehend aus einem Schlussel und einer Information, anhand ihres Schlussels zu lokalisieren. Das Universum ist total geordnet, und innerhalb eines Suchbaumes soll die Invariante \Knoten im lUb Key(Wurzel) Knoten im rUb\ gelten. Der hier zugrundeliegende Ansatz bemuht sich, innerhalb einer Folge von Operationen durch Realzeit-Umorganisation der Datenstruktur moglichst weit vom worstcase zu entfernen, statt die jeweiligen worst-case-Kosten zu minimieren. Bei jedem Zugri auf den Baum soll eine moglichst einfache Reorganisationsregel angewendet werden, um die Laufzeit kunftiger Operationen zu vermindern. Wie bei der MFR fur selbst organisierende Listen soll erreicht werden, da Elemente mit haugem Zugri moglichst nahe an der Wurzel liegen. Ein Element, auf das die Suchoperation angewendet wird, wird zur Wurzel befordet, in der i.a. berechtigten Honung, da weitere Zugrie auf dieses Element folgen. KAPITEL 1. HOHERE DATENSTRUKTUREN 42 Denition: Ein Splay-Tree ist ein interner binarer Suchbaum, d.h. \Knoten im lUb Key(Wurzel) Knoten im rUb\ Alle Knoten tragen Elemente, denn Zeiger auf Blatter sind NILPointer. Rotationen, um Knoten an die Wurzel zu bewegen. Beispiele: i) Einfach Rotation ii) Move to root ys x s;;@@ ;@ ; @ CJJ J AJ BJJ ) e ) ) sHH H d s HHH FJJ s c HH Hsb EJJ J ;@@ AJ a s; ;;@@ DJJ BJJ CJJ e xs s ;@ ; @y J ;@ A J ; @ J B J CJJ ) e sHH H d s HHH FJJ s c HH Hsa EJJ J ; AJ ; @@sb BJJ ;;@@ CJJ DJJ ) ) e sHH sHH s H s H a dH HH H J F s H Hsd FJJ J c s a HH ; @ J Hs b EJ ; @ b; s;@ @ c s ; @ ; @ J J ; @ A B ; @ ; @ J J ; @ EJJ J J J J AJ BJ CJ DJ CJJ DJJ a sXXXX XXse c s HH HHH H d s AJJ BJJ FJJ @ s;@ b; ;;@@ EJJ CJJ DJJ Beide Heuristiken benotigen fur geeignete Folgen von Zugrisoperationen (n) amortisierte Zeit. Beim MTR (Move To Root) im probabilistischen Sinn ist dies eine gute Komplexitat. Zugriswahrscheinlichkeiten sind fest und unabhangig. 1.6.2.2.2 Die Splaying-Operation Ein Knoten, auf den zugegrien wird (Splay(x T )), wird durch eine Folge von einfachen und doppelten Rotationen an die Wurzel bewegt. Falle: 1. (zig): x ist Kind der Wurzel von T : einfache Rotation KAPITEL 1. HOHERE DATENSTRUKTUREN ys s x ;;@@ ; ; @@ CJJ AJJ BJJ ) 43 xs s ;@ ; @y J ;@@ A J ; BJJ CJJ 2. (zig-zig): x hat Gro vater g(x) (und Vater p(x)) und x und p(x) sind jeweils linke (bzw. rechte) Kinder ihres Vaters. x=linkes Kind x=rechtes Kind g(x)=p(y)s g(x) ;@@ ;@ s y =p(x) ; bzw. ; @ p(x) p p p p p p p s p x s;;@@ DJJ ; ; @@ CJJ AJJ BJJ & DJJ ;;@@ x CJJ ;;@@ BJJ AJJ s s Doppelrotation x ;;@@ y AJJ ;;@@ z BJJ ;;@@ CJJ DJJ s s s 3. (zig-zag): x hat Gro vater g(x) und Vater p(x), x ist linkes (rechtes) Kind von p(x), p(x) ist rechtes (linkes) Kind von g(x). z =g(x) y=p(x)sHH s@ x HJ ; ; @s DJ ;@ AJJ ; @ J B J CJJ ) s xs s H y HH z ;@ ;;@@ ; @ J J J A B C J J J DJJ U bung: (Splaying-Operation mit dem eingekreisten Element durchfuhren) 1)zigzig 2)zigzag 3)zigzag 4)zigzig s s ; ; ; ; s ; s;@ @s s@; ; @s @ s@ @ fs @ 1)zigzig 2)zigzig 3)zigzig 4)zig ; s ; fs;; ; s ; ; s; s s ; s ; ; ; ; ; s s@ @s s@; ; @s s@; ; @s s@; ; @f s 1)zigzag 2)zigzag 3)zigzag 4)zig 1.6.2.2.3 Amortisierte Kostenanalyse der Splay-Operation Jeder P Knoten habe Gewicht w(x) > 0. Gewicht tw(x) des Unterbaums mit Wurzel x ist: y w(y) (8y im Unterbaum mit Wurzel x) KAPITEL 1. HOHERE DATENSTRUKTUREN Rang r(x) = log(tw(x)) Potential eines Baumes T : P x2T 44 r(x) Lemma: Sei T ein Splay-Tree mit Wurzel u, x ein Knoten in T . Die amortisierten u) Kosten fur Splay(x, T ) sind 1 + 3(r(u) ; r(x)) = O log tw( tw(x) . Beweis: Induktion uber die Folge von (Doppel)Rotationen: Berechne r und r0 , tw und tw0 , die Rang- bzw. Gewichtsfunktion vor und nach dem Rotationsschritt. Wir zeigen, da die amortisierten Kosten im Fall 1 (zig) 1+3(r0 (x) ; r(x)) und in den Fallen 2 und 3 (zig-zig bzw. zig-zag) 3(r0 (x) ; r(x)) sind. y sei der Vater von x, z der Gro vater (falls er existiert). 1. Fall: s y s H x HH ;@ ; @ CJJ AJJ BJJ ) x s s HH Hy ;@ J ; @ AJ J B J CJJ amortisierte Kosten: 1 + r0 (x) + r0 (y) ; r(x) ; r(y) 1 + r0 (x) ; r(x), da r0 (y) r(y) 1 + 3(r0 (x) ; r(x)), da r0 (x) r(x) 2. Fall: z p s p p ;@@ y; s p x s;;@@ DJJ ; ; @@ CJJ AJJ BJJ ) x p p p ;;@@ y AJJ ;;@@ z BJJ ;;@@ CJJ DJJ p s s s amortisierte Kosten: 2 + r0 (x) + r0 (y) + r0 (z ) ; r(x) ; r(y) ; r(z ) = 2 + r0 (y) + r0 (z ) ; r(x) ; r(y), da r0 (x) = r(z ) 2 + r0 (x) + r0 (z ) ; 2r(x), da r0 (x) r0 (y) und r(y) r(x) Es gilt, da 2 + r0 (x) + r0 (z ) ; 2r(x) 3(r0 (x) ; r(x)) d.h. 2r0 (x) ; r(x) ; r0 (z ) 2 Betrachte dazu die Funktion f(x y) = log(x) + log(y) auf dem Bereich x y > 0 x + y 1 KAPITEL 1. HOHERE DATENSTRUKTUREN 45 y Punkt 2 2 s@- 16 @ max Behauptung: ; 1 1 f(x y ) nimmt ihr eindeutiges Maximum im an. 0 1 x Beweis: Da die Funktion z ! log(z) streng monoton wachsend ist, kann sich das Maximum der Funktion f(x y) = log(x) + log(y) nur auf dem Geradensegment x + y = 1, x y > 0 benden. Dadurch erhalten wir ein neues Maximierungsproblem fur die Funktion g(x) = log(x) + log(1 ; x) auf diesem Geradensegment. Da g(x) an den Randern gegen ;1 strebt, mu es sich um ein lokales Maximum handeln. Die einzige Nullstelle der Ableitung g0 (x) = ln1a x1 ; 1 ;1 x wenn log = loga , ist x = 0:5 (unabhangig von a). Weiter ist g00 (x) = ; ln1a x12 + (1 ;1 x)2 : Da g00 (0:5) < 0 ist, nimmt g(x) in x = 0:5 sein globales Maximum an. Insgesamt folgt, da die Funktion f(x y) = log(x) + log(y) ihr globales Maximum im Bereich x y > 0, x + y 1 an der Stelle (0:5 0:5) annimmt. 3 Damit gilt: 0 tw( x ) tw ( z ) 0 0 r(x) + r (z ) ; 2r (x) = log tw0 (x) + log tw0 (x) ;2 da tw(x) + tw0 (z ) tw0 (x) 3. Fall: s zs H y HH ;@ ; @x DJJ ; @ J AJ ; @ BJJ CJJ s ) s xs s H y HH z ;@ ;;@@ ; @ AJJ BJJ CJJ DJJ amortisierte Kosten: 2 + r0 (x) + r0 (y) + r0 (z ) ; r(x) ; r(y) ; r(z ) 2 + r0 (y) + r0 (z ) ; 2r(x), da r0 (x) = r(z ) und r(x) r(y) 2(r0 (x) ; r(x)), da 2r0 (x) ; r0 (y) ; r0 (z ) 2 Letzteres folgt aus der Behauptung uber f(x y) wie im Fall 2. Die Gesamtbehauptung des Lemmas folgt dann durch Aufaddieren der amortisierten Kosten fur die einzelnen Schritte (Beachte: Teleskop-Summe). 3 Sei T ein Splay-Tree mit n Knoten. Die Verringerung des Potentials durch eine Folge von Splay-Operationen (splay(xj T ))j=1::n , falls sich die Gewichte nicht andern, KAPITEL 1. HOHERE DATENSTRUKTUREN beschrankt sich durch n X n X i=1 i=1 (log W ; log wi ) = log W w i W := 46 n X i=1 wi wi = Gewicht von xi : Satz: Die gesamten Kosten fur die m Zugrie sind O((m + n) log n + m). Beweis: amortisierte Kosten = reelle + $balance reelle Kosten = amortisierte - $balance. Wahle wi = n1 fur alle Knoten. ) amortisierte Kosten fur einen Zugri 1+3 log n, n n n P P P da W = wi = 1. Die Verringerung im Potential ist log wWi = log n = i=1 i=1 i=1 n log n. ) reelle Kosten m(1 + 3 log n) + n log n. 3 Satz: Sei q(i) die Anzahl der Zugrie auf das Element xi (in einer Folge von m Zugrien). Falls auf jedes Element zugegrien wird (also q(i) > 1 fur alle i), dann sind die (reellen) Gesamtkosten fur die Zugrie n X ! m O m + q(i) log q(i) i=1 Beweis: Setze Gewicht des i-ten Knotens gleich q(mi) . )W= n X i=1 q(i) = 1 Rest wie oben. m 3 Satz: Betrachte Folge von Zugrisoperationen auf eine n-elementige Menge. Sei t die dafur notige Anzahl von Vergleichen in einem operationalen statischen binaren Suchbaum. Dann sind die Kosten in einem (anfangs beliebigen) Splay-Tree fur die Menge O(t + n2 ). Beweis: Sei U die Menge, d die Tiefe eines (fest gewahlten) optionalen statischen Suchbaumes, sei fur x 2 U , d(x) die Tiefe von x in diesem Suchbaum. Deniere: tw(x) := 3d;d(x): Sei T ein beliebiges Splay-Tree fur U : bal(T ) X x2U X x2U tw(x) = r(x) = X x2U log 3d;d(x) = = ((log 3) X x2U 3d;d(x) X x2U d X i=0 X x2U (log 3)(d ; dx ) = (d ; d(x))) = O(n2 ) 2i 3d;i = 3d (T ) log 3d+1 = log 3d(x)+1: ) log tw tw(x) 3d;d(x) d X ( 32 )i 3d 1 2 = 3d+1 1; 3 i=0 Damit ergibt sich fur die amortisierte Kosten fur Splay(x T ): (T ) O(log tw tw(x) ) = O(d(x) + 1). n = jU j KAPITEL 1. HOHERE DATENSTRUKTUREN 47 Damit sind die amortisierten Kosten c: Zugriskosten (# Vergleiche) im optimalen Suchbaum (wo sie d(x)+1 sind). Die gesamten amortisierten Kosten fur die Zugrisfolge sind daher c:t. Damit sind reelle Kosten a:Kosten + Verringerung des Potentials = O(t + n2 ). 3 1.6.2.2.4 Worterbuchoperationen in Splay-Trees Betrachte (Alle diese Operationen werden mit Hilfe von Splay implementiert): Access(i, T ): p (Haben wir bereits) Join(T1, T2 ): gro tes Element in T1 s s HH j ; ;! ; ;! ;;@@ JJ JJ JJ JJ JJ JJ T1 T10 T2 T2 | {z } T10 beachte x 2 T1 y 2 T2 , dann gilt x < y Split(i, T ): i bzw. i;Hoder i+ s T2 s s H j @ iT ) ;;@@ ;! ;; @ bzw. JJ ;Access( ;;;;;; ! J J J J J T J J J J J JJ Insert(i, T ): Split(i, T ) ;! ;! JJ Delete(i, T ): Access(i, T ) ;! JJ is ;@ ; @ J J JJ ;! is ;;@@ JJ JJ JJ JJ Join ;;! JJ T 0 = T ; fig Denition: Sei i 2 U T ein Splay-Tree. Dann bezeichnen wir mit i; (bzw. i+) den Vorganger (bzw. den Nachfolger) von i in der gegebenen Ordnung in T (falls diese existieren). Falls i; bzw. i+ undeniert sind, so setzen wir w(i;) = 1 bzw. w(i+) = 1. Weiterhin sei W das Gesamtgewicht aller an einer Worterbuch-Operation beteiligten Knoten. KAPITEL 1. HOHERE DATENSTRUKTUREN 48 Satz: Fur die amortisierten Kosten der Worterbuch-Operationen in Splay-Trees gelten die folgenden oberen Schranken: (T T1 T2 = 6 0) i; := gro test Element in T kleiner als i i+ := kleinstes Element in T gro er als i 8 > W + O(1) falls i 2 T > < 3 log w(i) Access (i T ) : > W > : 3 log minfw(i; ) w(i+ )g + O(1) falls i 62 T 8 > > < Split(i T ) : > > : W + O(1) falls i 2 T 3 log w( i) 3 log minfw(i;W) w(i+ )g + O(1) falls i 62 T Join(T1 T2 ) : 3 log W + O(1) i maximal in T 1 w(i) W + O(1) W ; w(i) + log Insert(i T ) : 3 log ; + minfw(i ) w(i )g w(i) i62T Delete(i T ) : 3 log i2T W ; w(i) W w(i) + 3 log w(i; ) + O(1) falls i nicht minimal in T 1.6.3 Weitere Arten von Datenstrukturen Dynamische Datenstrukturen: Referenz: Bent, S. W.: Dynamic weighted data structures, TR STAN-CS-82916, Department of Computer Science, Stanford University, 1982 Persistente Datenstrukturen: Referenz: Driscoll, J. R., Sarnak, N., Sleater, D. D., Tarjan, R. E., Making data structures persistent, Proceedings of the 18th Annual ACM Symposium on Theory of Computing (STOC), 1986. p.109{121. 1.7 Radix-basierte Priority-Queue 1.7.1 Buckets Eine relativ einfache Moglichkeit, Vorrangwarteschlangen zu implementieren, stellen Buckets dar. Diese Implementierung beinhaltet einen Array von Buckets, wobei der i-te Bucket alle Elemente mit den Schlusseln key(x)=i enthalt. Sobald der Schlussel eines Elements sich andert, wird das Element vom alten Bucket entfernt und entsprechend dem neuen Schlussel in dem neuen Bucket eingefugt. KAPITEL 1. HOHERE DATENSTRUKTUREN 49 Dazu mussen folgende Annahmen erfullt sein: Schlussel sind ganzzahlig Zu jedem Zeitpunkt gilt fur die zu speichernden Elemente: gro ter Schlussel - kleinster Schlussel C Diese Bedingungen sind zum Beispiel beim Algorithmus von Dijkstra erfullt. C ist hier gleich der maximalen Kantenlange. 1.7.1.1 1-Level-Buckets 1-Level-Buckets bestehen aus: einem Array b0 : : : C + 1] zur Aufnahme der Buckets. Jedes bi enthalt einen Pointer auf der Liste der Elemente im Buckets, einer Zahl minvalue, die gleich dem kleinsten gespeicherten Schlussel ist, einer Zahl 0 minpos C , die den Index des Buckets mit dem kleinsten Schlussel enthalt und einer Zahl n, die die Anzahl der gespeicherten Elementen enthalt. C =9 minvalue = 16 minpos = 6 n=6 0 ? 20 1 2 3 ? 23 4 ? 5 -6 ? ? 25 16 7 8 9 ? 18 ? 16 Wie bei jeder Vorrangswarteschlange mussen drei Operationen unterstutzt werden: Insert(x): fugt das Element x in die Vorrangswarteschlange ein. Falls der Schlussel des neuen Elements kleiner als der minvalue ist, minpos und minvalue aktualisieren. ExtractMin: liefert und loscht eines der kleinsten Elemente der Vorrangswarteschlange (falls das Element das kleinste ist, muss minpos und minvalue noch aktualisiert werden). DecreaseKey(x k): verringert Schlussel des Elements x auf den Wert k (falls notig, minpos und minvalue aktualisieren). KAPITEL 1. HOHERE DATENSTRUKTUREN 50 Dazu kommt noch eine Initialisierung Initialize. Fur 1-Level-Buckets sehen die Operationen wie folgt aus: 1. Initialize(x): n := 0 minvalue := 1 reserviere Platz f ur b (C sei bekannt) 2. Insert : Fuge x in bKey(x) mod (C + 1)] ein n := n + 1 if (Key(x) < minvalue) then co x ist jetzt das Element mit dem minpos := Key(x) mod (C +1) minvalue := Key(x) kleinsten Schl ussel oc fi 3. ExtractMin: Entferne ein beliebiges Element aus bminpos] n := n ; 1 if (n > 0) then co suche neues Element mit dem kleinsten Schl ussel oc while ] ist leer do := ( + 1) mod ( + 1) od := Key eines Elements in ] else := fi b minpos minpos minpos minvalue minvalue 1 C b minpos 4. DecreaseKey(x k): verringert Schlussel des Elements x auf den Wert k x k x < minvalue) then minpos := Key(x) mod (C +1) minvalue := Key(x) Key( ) := if (Key( ) fi Bei geeigneter Implementierung der Buckets, z.B. als doppelt verkettete Listen gilt: Satz: Die worst-case reellen Kosten sind O(1) bei Insert, DecreaseKey und O(C ) (bei Initialize ) und ExtractMin Operationen. Beweis: Wird x am Anfang der Liste eingefugt, so mussen bei Insert nur einige Zeiger umgehangt sowie n, minpos und minvalue angepa t werden, was wieder nur ein paar Zeigeroperationen sind. Die Aktualisierung von n, minpos und minvalue benotigt auch nur konstante Zeit. Fur das Finden des nachstkleinsten Elements mussen aber moglicherweise alle weiteren Buckets betrachtet werden, im schlimmsten Falle C . Da bei DecreaseKey das Element x direkt ubergeben wird, sind neben dem Einfugen auch nur wenige Zeigeroperationen und je eine Zuweisung an n und Key(x) notig. 3 KAPITEL 1. HOHERE DATENSTRUKTUREN 51 1.7.1.2 2-Level-Buckets Bei einem gro en Wertebereich der zu speichernden Schlussel, das hei t beim gro en C , und einer geringen Anzahl tatsachlich abgelegter Datenelemente sind 1-LevelBuckets in zweifacher Hinsicht ungunstig: Das Array b belegt statisch Speicherplatz der Gro e O(C ), obwohl nur ein kleiner Teil davon wirklich gebraucht wird. Der Zeitbedarf fur ein ExtractMin nahert sich der worst-case-Komplexitat O(C ), da der nachste nicht-leere Bucket ziemlich weit entfernt sein kann. 2-Level-Buckets versuchen demp mit folgender Idee abzuhelfen: Es gibt ein TopBucket (btop) bestehend aus j C + 1j Buckets und zu jedempBucket in btop gibt es noch ein weiteres Bottom-Bucket (bbots), das auch aus B=j C + 1j Buckets besteht. Das i-te bbot nimmt Elemente auf, deren Schlussel im Interval iB (i + 1)B] liegen. Um ein Element in ein Bucket einzufugen, wird zuerest das passende Bucket in btop gesucht. Dann wird in dem dazugehorigen bbot das Element (wie bei 1-LevelBuckets) eingefugt. C =9 minvalue = 16 minpos = 6 n=6 0 ? 20 1 2 3 ? 23 4 ? 5 -6 ? ? 25 16 7 8 9 ? 18 ? 16 Um sowohl Platz als auch Zeit zu sparen, kann man durch leichte Modizierung nur ein einziges Bottom-Bucket einsetzen: Verwende zwei Arrays (Top-Bucket und Bottom-Bucket) der Lange: p B = j C + 1j + 1 Dabei enthalt das Top-Bucket die meisten Elemente in grob vorsortierter Form, nur die Elemente mit den kleinsten Schlusseln werden im Bottom-Bucket dann endgultig sortiert vorgehalten. 2-Level-Buckets konnen mit folgenden Elementen aufgebaut werden: Das Array btop (0::B ;1]) nimmt in jedem Bucket Elemente mit Schlusseln aus einem Intervall der Lange B auf die Schlussel stammen aus allen Intervallen au er dem niedrigsten. Das Array bbot (0::B ; 1]) nimmt in jedem Bucket Elemente mit genau einem Schlussel auf die Schlussel stammen nur aus dem niedrigsten. valtop ist die linke Intervallgrenze des niedrigsten Intervalls. postop enthalt den Index des Buckets in btop fur das niedrigste Intervall (das aber in bbot gespeichert wird). KAPITEL 1. HOHERE DATENSTRUKTUREN 52 nbot ist die Anzahl der Elemente in bbot. n ist die Anzahl der Elemente in bbot und btop. C = 80 valtop = 6 postop = 2 btop : bbot : nbot = 4 ? 0 1 -2 0 1 pp pp ? pp 86 pp pp pp pp pp pp p p p p p p p p p p pp 2 ? 7 3 4 5 6 7 8 9 3 4 5 6 7 8 9 pp pp ? ? ? ? pp 35 48 57 85 pp pp pp ? ? pp 26 63 pp p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p pp pp ? 11 ? 13 ? 7 Dabei gilt: btop(postop + i) mod B ] enthalt alle Elemente x mit: valtop + iB Key(x) < valtop + (i + 1)B , wobei 1 i B ; 1 bboti] enthalt alle Elemente x mit: Key(x) = valtop + i, wobei 0 i B ; 1 Dazu ist allerdings folgende Annahme zu machen: Hat ein ExtractMin ein Element mit Schlussel k zuruckgeliefert, werden bis zum nachsten Aufruf von ExtractMin nur Elemente mit Schlusseln k und k + C eingefugt. Dies stellt sicher, da ein Element aus bbot nie nach btop wandert. Lemma: Zu jedem Zeitpunkt haben alle Schlussel Platz in der Datenstruktur. Beweis: Am meisten Platz wird benotigt, wenn der kleinste Schlussel ganz rechts in bbot gespeichert oder dort entfernt worden ist. Er hat dann den Wert valtop + B ; 1. Der gro te Schlussel, der nun vorkommen kann und also Platz nden mu , ist KAPITEL 1. HOHERE DATENSTRUKTUREN 53 valtop + B ; 1 + C : gro tmoglicher Schlussel in btop = valtop + BB ; 1 = valtop + B + (B ; 1)B ; 1 p p = valtop + B + (d C + 1e + 1)d C + 1e ; 1 p valtop + B + C + 1 + d C + 1e ; 1 valtop + B ; 1 + C = gro tmoglicher erlaubter Schlussel 3 Annahme: Vor dem ersten ExtractMin werden nur Elemente mit 0 Schlussel C eingefugt. i) Initialize : valtop = postop = nbot = n = 0 Initialisiere bbot, btop ii) Insert(x): uberpr ufe Invarianten i := b Key(x)B;valtop c + postop mod B if i == postop then F uge x in bbotKey(x) ; valpop] ein nbot := nbot + 1 n := n + 1 else F uge fi x in btopi] ein iii) ExtractMin bbot j oc co suche kleinstes Element in := 0 while ] == do := + 1 od entferne ein (beliebiges) Element aus := 1 := 1 if == 0 then return fi if == 0 then while ] == do := ( + 1) mod := + od while ] = do entferne beliebiges Element aus F uge im Key( ) ] ein := + 1 od fi j bbot j j nbot nbot ; n n ; n nbot btop postop postop postop valtop valtop B nbot bbot nbot x ; valtop x iv) DecreaseKey(x k) x enferne aus seinem momentanen Bucket falls n otig, aktualisiere Key( ) := Insert( ) x x k und gib es zur uck B btop postop 6 x bbotj ] nbot btoppostop] KAPITEL 1. HOHERE DATENSTRUKTUREN 54 Lemma: Worst-case (reelle) Laufzeit p bei 2-Level-Buckets sind fur Insert und Dep creaseKey O(1), fur ExtractMin O(n + C ) und O( C ) (bzw. O(1)) fur Initialize. Beweis: - Insert : O(1) + 1 = O(1) - DecreaseKey : O(1) + ( 0) = O(1) btop p p - ExtractMin O( C + C + # Elemente # ). 3 bbot Potential: Anzahl von Elementen im Buckets im btop. Satz: Amortisierte Kosten fur 2-Level Buckets sind O(1) bei Insert und Decreasep Key und O( C ) bei ExtractMin. Beweis: - Insert : s.o. - DecreaseKey : s.o. p - ExtractMin: O( C + # Elemente btop btop p # ); # Elemente # = O( C ) bbot bbot 1.7.1.3 k-Level-Buckets 3 Die Verallgemeinerung von 2-Level-Buckets fuhrt zu k-Level-Buckets. Diese bestep hen dann aus k-Arrays der Lange j k C j. Dadurch lassen sich die Speicher- und Zeitkomplexitat weiter verbessern, der Implementierungsaufwand steigt jedoch stark an. Zeitkomplexitat: O(C 14 ) Literartur: Aluja, R.K., K. Mehlhorn, J.B. Orbin, R.E. Tarjan Faster Algorithmus for the shortest Path Problem J.ACM 37 (1990) p.213-223 Cherkassky, B.V., A.V. Goldberg, T.Ratzig Shortest Path Algorithmus: Theory and Experimental Evaluation Math. Prog. 73(1996) p.129-174 Cherkassky, B.V., A.V. Goldberg, C. Silverstein: Buckets, Heaps, Lists and monoton Priority Queues. p Proc. 8th Soda, ACM p83-92, 1997 Hot-Queue O( log C ) KAPITEL 1. HOHERE DATENSTRUKTUREN 55 1.7.2 Von-Ende-Boas-PQ Von Ende Boas, P., R. Kaas, E.Zijlstra: Universum U jU j = N U N Hier: U = f0 1 : : : N ; 1g Bessere Priority-Queue fur den Fall n log N 0 0 1 1 0 ::: 0 1 ::: 0 qq ::: A AU O 0 ::: N ;1 q ; - ; ; ; Delete p Baum mit n Verzweigungen Insert 01 HH ;@ ;@ ; @ ; @ : 01 1 0 : :? qq A AU ::: ::: 0 ::: q - N ;1 Sei k 2 N k 2 k0 = k2 k00 = k2 x 2 0j : : : k 2k ; 1] k Bits x0 = 2kx00 x00 := x mod 2k00 (x0 vordere Halfte, x00 hintere Halfte der Bits) Sei S = fx1 : : : xm g 0 : : : 2k ; 1] Denition: Eine k-Struktur T fur S besteht aus: 1. der Zahl T.size = jfx1 : : : xm gj = jS j = m 2. einer doppelt verketteten Liste T.list, die die Elemente von S in aufsteigender Reihenfolge enthalt 3. einem Bitvektor T.b0 : : : 2k ; 1] mit T.bi] = 01 falls ii622SS einem Zeiger (Pointer) Vektor T.p0 : : : 2k ; 1]. Falls T.bi] = 1, dann zeigt T.pi] auf i in der Liste aus 2. 4. einer k0 -Struktur T.top und einem Feld T.bottom0 : : : 2k` ; 1] von k00 -Strukturen. Falls m = 1, dann T.top, T.bottom und die zugehorigen k00 -Strukturen leer, T.size = 1. T.list = fxg, der Bitvektor wird nicht benotigt. Falls m > 1, dann ist T.top eine k0 Struktur fur die durch fx01 x02 : : : x0m g gegebene Menge, und fur 0 k jedes x 2 0 : : : 2 ; 1] ist T.bottomx] eine k00 -Struktur fur die Menge fx00i 1 i m x = x0i g KAPITEL 1. HOHERE DATENSTRUKTUREN 56 Beispiel: k = 4 S = f2 3 7 10 13g T.size = 5 N ;1 0 0011000100100100 T.b T.p ? ? q qA ? ? ? q ? ? q ? ? q ? ? T.list U A ? ? ? 2 - 3 - 7 -10 -13 0010 0011 0111 1010 1101 T.top ist 2-Struktur f0 1 2 3g T.bottom0] ist eine 2-Struktur fur f2 3g T.bottom1] ist eine 2-Struktur fur f3g T.bottom2] ist eine 2-Struktur fur f2g T.bottom3] ist eine 2-Struktur fur f1g Operation Succ(x) ndet minfy 2 S y > xg in der k-Struktur T. 2 k=1 or T.Size naive Suche else if T.size = 0 or return(Succ( else k j if then x max in T.list x) gibt's nicht) then x0 := 2kx00 x00 := x mod 2k00 if T.top.bx0 ] = 1 and x00 < maxfT.bottomx0 ]g 00 return(x0 2k + Succ(x00 T.bottomx0 ]) else fi z 0 :=Succ(x0 T.top), then z 0 2k00 + minfT.bottomz 0 ]g) return( fi fi T.top H k0 H 2 J J HHH h 0 J H k T.Bottom0] J T.Bottom 2 succ(xJ) J ;;;;! T.Bottom1] x JJ JJ i ;1 Kosten: T(k) c + T( k2 ) = O(log k) Lemma: Die Succ -Operation hat Zeitbedarf O(log k) Beweis: p Insert Operation: falls x bereits in Priority-Queue, dann fertig 3 KAPITEL 1. HOHERE DATENSTRUKTUREN 57 bestimme Succ(x T), fuge x davor ein bestimme x0 und x00 behandle die entsprechende Unterstrukturen rekursiv: Insert(x0 ,T.top), Insert(x00 ,T.bottomx0]) (nur ein nicht trivialer rekursiver Aufruf) Zeitbedarf: naiv O(log2 k), Optimierung: das oberste Succ tut alles O(log k) Delete Operation: Komplexitat von Delete in k-Struktur: O(log k) Kosten der Initialisierung: Gro e der Datenstruktur Platzbedarf fur k-Struktur: Sei S(k) der Platzbedarf fur eine k-Struktur. Dann gilt: S(1) = c S(k) = c2k + S(k0 ) + 2k0 S(k0 ) fur k 2 Wir ersetzen zur Vereinfachung: S(k) = c2k + S( k2 ) + 2 k2 S( k2 ) Lemma: S(k) = O(2k log k) Beweis: Setze: S(k) := c0 2k log k (besser: Zeige S(k) := c0 2k log k funktioniert) Fur k = 1 klar Rekursionsschritt: Platz fur k-Struktur c2k + c0 2 k2 (log k ; 1) + 2 k2 c0 2 k2 (log k ; 1) = c2k + c0 2 k2 (1 + 2 k2 )(log k ; 1) = c2k + c0 2 k2 (2 k2 log k + log k ; 2 k2 ; 1) c2k + c0 2 k2 (2 k2 log k + log k ; 2 k2 ) c0 2k log k falls c2k + c0 2k log k + c0 2 k2 log k ; c0 2k c0 2k log k , c0 2 k2 log k (c0 ; c)2k 0 , c c;0 c log2kk (Gilt fur c0 gro genug.) 3 Satz: Sei N = 2k , Universum U = f0 : : : N ; 1g. Wird eine Teilmenge S U durch eine k-Struktur dargestellt, dann benotigen die Operationen Insert, Delete und FindMin jeweils Zeit O(log log N ), die Initialisierung Zeit O(N log log N ). Der Platzbedarf ist ebenfalls O(N log log N ). Beweis: s.o. 3 Literatur zu van Emde Boas-Priority Queue: 1. Mehlhorn Bd. 1, S.290-296 2. van Emde Boas, P., R. Kaas, E. Zijlstra: Design and Implementation of an e"cient priority queue, Math. Systems Theory 10 (1977), S. 99-127 KAPITEL 1. HOHERE DATENSTRUKTUREN 58 1.7.3 Radix-Heaps Radix-Heaps stellen eine Moglichkeit zur e"zienten Realisierung von Priority-Queues dar, wobei ahnliche Randbedingungen wie bei den 2-Level-Buckets vorausgesetzt werden. Dabei wird die amortisierte Laufzeit der p langsamsten Zugrisfunktion im Vergleich zu diesen verbessert, ahnlich von O( C ) auf O(log C ). C bezeichne wie bei den 2-Level-Bauckets die maximale Dierenz zwischen zwei Schlusseln im Heap. Die Grundidee besteht darin, anstelle einer Hierarchie von Buckets konstanter Gro e, Buckets mit exponentiell zunehmender Gro e zu verwenden. Somit sind nur noch O(log C ) Buckets zur Verwaltung der Elemente im Heap notig. Wie bei 2-LevelBuckets hangt die Laufzeit der \teueren\ Operationen direkt von der Anzahl der Buckets ab. 1 1 2 4 8 z }| { z }| { z }| { z }| { z }| { 0 1 2 log C 4 8 16 pppppppppp Randbedingung: Schlussel 2 N0 max-Schlussel - min-Schlussel stets C Monotonie von ExtractMin Implementierung: B:= dlog(C + 1)e + 1 Buckets b0::B] Schranken fur Backets u0::B + 1] uB + 1] = 1 Bucket-Nr b nox] Index der aktuellen Buckets fur x Invarianten: i) ui] Schlussel in bi] ui + 1] ii) u1] = u0] + 1 0 ui + 1] ; ui] 2i;1 fur i = 1 : : : B ; 1 Operationen: 1. Initialize : Leere Buckets erzeugen und die Bucketsgrenzen ui] entsprechend der Invariante ii) setzen. for i = 0 to B do bi] := od u0] = 0 u1] = 1 for i = 2 to B do ui] := ui ; 1] + 2i;2 od 2. Insert(x): Um ein neues Element einzufugen, wird linear nach dem richtigen Buckets gesucht, wobei die Suche beim gro ten Bucket beginnt. KAPITEL 1. HOHERE DATENSTRUKTUREN i :=B u i > Key(x) bi] ein while ] f uge x in do i := i ; 1 59 od 3. DecreaseKey(x K ): Hierbei wird analog zur Prozedur Insert linear nach dem Bucket gesucht, in den das Element mit dem veranderten Schlussel eingeordnet werden mu . Der einzige Unterschied besteht darin, da die Suche in diesem Fall beim aktuellen Bucket des Elements beginnen kann, da der Schlussel erniedrigt wird und das Element deshalb nie in einen gro eren Bucket wandern kann. Aus diesem Grund war es notwendig, zu jedem Element x die dazugehorige Bucketnummer in b nox] zu speichern. i := b nox] entferne x aus bi] x k ui >k x bi Key( ) := co Uberpr ufung, das alles stimmt oc while ( ] ) do := 1 od f uge in ] ein i i; 4. ExtractMin: Hierbei wird zuerst nach dem kleinsten nicht leeren Bucket gesucht und der kleinste dort enthaltene Schlussel k festgestellt. Wenn der kleinste Bucket bereits ein Element enthalt, so kann dieses ausgegeben werden und es ist sonst nichts zu tun. Anderfalls wird u0] auf k gesetzt und die Bucketgrenzen gema der Invarianten neu gesetzt. Danach wird ein minimales Element aus dem kleinsten Bucket, der nun nicht mehr leer sein kann, ausgelesen und entfernt. Von dieser \Aufraumarbeit\ sind nur der kleinste nicht-leere Bucket und die davor liegenden leeren Buckets betroen. i := 0 Entferne und (und gib zur uck) ein beliebiges Element in bi] if # Elemente in Radix-Heap = 0 then return while bi] == do i := i + 1 k := kleinster Schl ussel in bi] u0] = k u1] = k + 1 for j = 2 to i do uj ] = minfuj ; 1] + 2j;2 ui + 1]g od od verteile alle Elemente aus Beispiel: 0 1. ExtractMin 0 0 1 2 bi] 4 @ ; 0 ; @ 0 0 1 2 4 6 6 7 6 6 7 auf b0] b1] : : : bi ; 1] 8 16 pppppppp 8 16 pppppppp KAPITEL 1. HOHERE DATENSTRUKTUREN 2. ExtractMin 0 @ ; 0 ; @ 1 2 6P iP 7 8 6 6 7 4 6 6 7 8 1 P@ I ; P @ ; 60 8 16 pppppppp 8 16 pppppppp neu gesetzte Intervallgrenzen bi] 6= ) Intervallgro e 2i;1 Innerhalb bi] stehen i ; 1-Buckets zur Verfugung mit Intervallen k k +1 k + 2 k + 4 : : : k + 2i;2 k + 2i;1 bzw. hochstens ui + 1]. Da alle Schlusseln in bi] aus dem Intervall k minfk + 2i;1 ; 1 ui + 1] ; 1g] sind, passen sie alle in b0] b1] : : : bi ; 1]. Analyse der amortisierten Kosten: Potential: X x2Radix-Heap b nox] Amortisierte Komplexitat: i) Initialize : O(1) bzw. O(B ) ii) Insert : O(B ) iii) DecreaseKey :O($b nox] ; $b nox] + 1) = O(1) P P iv) ExtractMin: O(B + x2bi] $b nox] ; x2bi] $b nox]) = O(B ) = O(1) Satz: Ausgehend von einem leeren Heap betragt die worst-case (reelle) Lauf- zeit fur k-Insert, l-DecreaseKey und ExtractMin Operatinen bei Radix-Heap: O(k log C + l) 1.8 Union-Find-Datenstrukturen 1.8.0 Motivation ' r r r r $ Union(T1 T2): Vereinige T1 und T2 ' $ T1 \ T2 = ' r $ x): Finde den Reprasentanten r - r 3 6 r r r Find( der gr o ten Menge, in der sich x ger rade bendet. & % % & & % KAPITEL 1. HOHERE DATENSTRUKTUREN 61 1.8.1 Union-Find-Datenstruktur 1.8.1.1 Intrees 1. Initialisierung: x ! x: Mache x zur Wurzel eines neuen (einelementigen) Baumes. r ;@ r ;@ 2. Union(T1 T2): ; T1 @ ; T2 @ ) 1r ;; r T@ 1@ ;@ ; T2 @ 3. Find : Suche Wurzel des Baumes, in dem sich x bendet. Bemerkung: Naive Implementation: worst-case-Tiefe = n Zeit/Find = (n) Zeit/Union = O(1) 1.8.1.2 Gewichtete Union (erste Verbesserung) Mache die Wurzel des kleineren Baumes zu einem Kind der Wurzel des gro eren Baumes. Die Tiefe des Baumes ist dann O(log n) Zeit fur Find = O(log n) Zeit fur Union = O(1) Es gilt auch: Tiefe des Baumes in worst-case : (log n) 1.8.1.3 Pfad-Kompression mit gewichteten Union (zweite Verbesserung) Problem: Folge von k Find - und Union-Operationen auf einen Operation mit n Elementen, darunter n ; 1 Union. Implementierung: Gewichtete Union, Find 's fur Pfad-Kompression: s x s s @ I y ;; @ z @ I ; a; @b @ I ; c; @d ; e; s s s s s x s s t ; ;@ I ; ; @ y; ; @z @ @ ; I @ ; @ a; @ @b ; ;@ I ; ; @ c; ; @d ; ; e; t t t t A s s @ I ; B; @E @ I ; C; @D t t t s ) Union Find(c) (Pfadkompression) ) s x s sA s s s s s s s s s s xt 3 kQ Q KQ A A QQ Q c y b t Atz Q Qt t ; K A a; t ; AAtd e t @ I ; @ I ; @ z B; @E @ I ; C; @D y; @ I ; a; @b @ I ; c; @d ; e; KAPITEL 1. HOHERE DATENSTRUKTUREN 62 Bemerkung: Nach der Denition ist log = minfi 1 log log log : : : log n} 1g. {z | i;log 's Beispiele: log 0 = log 1 = 1 log 2 = 1 log 3 = 2 2 log 16 = 22 = 32 2 log 265536 = 222 = 5 Satz: In der obigen Situation ergibt sich eine amortisierte Komplexitat von O(log n) pro Operation. Beweis: Sei T 0 der (endgultige) In-Baum, der durch die Folge der Union's, ohne die Find 's entstehen wurde (also keine Pfad-Kompression). Ordne jedem Element x drei Werte zu: rank(x):= Hohe des Unterbaums in T 0 mit Wurzel x class(x):= i 1 falls ai;1 < rank(x) ai ist (i 1) 0 falls rank(x) = 0 Dabei gilt: a0 = 0 ai = 2 2 2:: i;20 en fur i 1 p 6p p p p p p p p p p p p p 5 t * tp HYpHp pHp pt0p p p p p p p p p p p class 2 X p p *p p p HYpHp pHp t0 p p p p p y Xp p p p 4 t p p p pp * p p p p p p p p p 3 t p p p p class 1 X p p p p y Xp p p *2 tpp *pp pp p p p p p p p p p p p p p p p pp 1 p X p pp p pp pp p p 0 ptp p *p p tp p p p p p p p p p p p p p p Xz class 0 ppppp ppppp ppp pp class 3 XX y dist(x) ist die Distanz von x zu einem Vorfahr y im momentanen Union-Find- Baum (mit Pfad-Kompression) mit class(y) > class(x) bzw. y ist Wurzel des Baumes. Deniere eine geignete Potentialfunktion: Potential := c Px dist(x) c ist eine geignete Konstante > 0 Beobachtungen: i) Sei T ein Baum in der aktuellen Union-Find-Stuktur (mit Pfad-Kompression), seien x y Knoten im T , y Vater von x ) class(x) class(y). ii) Aufeinander folgende Find(x) besitzen (bis auf eine) verschiedene Kanten. Diese Kanten sind (im wesentlichen) eine Teilfolge der Kanten in T 0 auf dem Pfad von x zur Wurzel. KAPITEL 1. HOHERE DATENSTRUKTUREN 63 Amotisierte Kosten Find(x): Sei x0 ! x1 ! x2 : : : xk = r die Pfad von x0 zur Wurzel. Kanten (xi;1 xi ) mit class(xi;1 ) = class(xi ). Es gibt hochstens log n-Kanten (xi;1 xi ) mit class(xi;1 ) < class(xi ). Ist class(xi;1 ) = class(xi ) und i < k (also xi = 6 r), dann ist dist(xi;1 ) vor der Find(x)-Operation 2, nachher gleich 1. Damit konnen die Kosten fur alle Kanten (xi;1 xi ) mit class(xi;1 )=class(xi ) aus dem Potentialverringerung bezahlt werden und es ergeben sich amortisierte Kosten: O(log n) Amortisierte Kosten aller (n ; 1)-Union's zusammen: cgp sp rp p p pp p p p cgsx p p p p p T1 < cgp sp rp 0 p p pp p p p p p p p p T 2 ) cg sp r0 cgp s rp p p p p p p pp p p cp gsx p p p p p T2 p p p T1 Die gesamte Potentialerhohung durch alle Union's ist nach oben durch das Potential von T 0 beschrankt (Beobachtung ii). Potential(T 0 ) log Xn ai X dist(x) log Xn ai X n 2j ai rank(x)=j =ai;1 +1 i=0 rank(x)=j =ai;1 +1 i=0 log n log n X X 1 = O(n log n) n ai 2a1i;1 = i=0 i=0 3 1.8.1.4 Erweiterung 1) Bessere obere Schranke (k n) k n. Ackermannfunktion: A(m n): A(0 n) = 2n n 0 A(m 0) = 2 m 1 A(m + 1 n + 1) := A(m A(m + 1 n)) n m 0 ? 2 2 2 2 - 2 4 4 8 ; ; 6 8 s pp Die Ackermannfunktion steigt asymptotisch schneller als jede primitiv-rekursive Funktion. KAPITEL 1. HOHERE DATENSTRUKTUREN 64 Denition: Die Klasse der primitiv rekursiven Funktionen2 (auf den naturlichen Zahlen) ist induktiv wie folgt deniert: 1. Alle konstanten Funktionen sind primitiv rekursiv. 2. Alle identischen Abbildungen (Projektionen) sind primitiv rekursiv. 3. Die Nachfolgerfunktion auf den naturlichen Zahlen ist primitiv rekursiv. 4. Jede Funktion, die durch Einsetzung (Komposition) von primitiv rekursiven Funktionen entsteht, ist selber primitiv rekursiv. 5. Jede Funktion, die durch sog. primitive Rekursion aus primitiv rekursiven Funktionen entsteht, ist primitiv rekursiv. Primitive Rekursion bedeutet, da die denition von f (n +1 ) zuruckgefuhrt wird auf f (n ). Formaler, f mu ein Gleichungssystem der folgenden Form erfullen: f (0 ) = g( ) f (n + 1 ) = h(f (n ) ) wobei g h bereits primitiv rekursive Funktionen sind. (n n) = minfi A(i i) ng Ebenso entsprechend die untere Schranke. 2) Varianten s ; x; s 2 ; ; s ; ; s ; ; s sr ; ; s s Gro vater - s s - s s ; ; 6 6 U.Schoning, Theoretische Informatik kurz gefat, BI-Verlag, 1993 ', p. 105. Kapitel 2 Selektieren und Sortieren 2.1 Einleitung Gegeben: Menge S von n Elementen aus einem total geordneten Universum U , i 2 N, 1 i n. Gesucht: i-kleinstes Element in S Bekannt: Falle i = 1 n (Minimum, Maximum bestimmen) Standardalgorithmus: n ; 1 Vergleiche Zeigen: Diese Anzahl ist optimal: Beweis: Interpretiere jeden Algorithmus als Turnier. Ein Spiel wird vom kleineren Element gewonnen. Beobachtung: Jedes Element au er dem Gesamtsieger mu mindestens ein Spiel verloren haben ) n ; 1 Vergleiche notwendig. Nun: Bestimmung des Vize-Meisters (bzw. zweitkleinstes Element) 3 Satz: Das zweitkleinste Element kann mit n + dlog2 ne ; 2 Vergleichen bestimmt werden. Beweis: einem K.O. Turnier: (n ; 1) Vergleiche. Beobachtung: Das zweitkleinste Element ist unter den "Verlierern\ gegen das Minimum zu suchen. Deren Anzahl ist dlog2 ne. Bestimme unter diesen Elementen wiederum das Minimum zweitkleinstes Element (dlog2 ne ; 1) 3 Literatur: Carroll, Lewis: Lawn Tennis Tournaments. St. Jones Garzette (Aug. 1, 1883), p. 5-6. Reprinted in the complete work of lewis Carroll. New York. Modern Librarry 1947. Pratt, V.R. and F.F. Yao: On lower bounds for computing the i-th largest element. Proc. 14. Anm IEEE. Swat (1973), p. 70-81. Knuth, D. E. Vol. 3 Deniere: i = d n2 e : Median (das mittlere Element) = d n2 e - kleinstes Element. 65 KAPITEL 2. SELEKTIEREN UND SORTIEREN 66 2.2 Der Blum-Floyd-Pratt-Rivest-Tarjan SelektionsAlgorithmus Blum, M. and RW. Floyd and V.R. Pratt and R.L. Rivest and R.E. Tarjan: Time bounds for selection. JCSS (1973), p. 448-461. Sei m eine kleine ungerade Zahl (etwa 5 m 21). Sei S := fa1 : : : an g. Suche i-kleinstes Element in S . Wir betrachten folgenden Algorithmus BFPRT: 1. Teile S in mn Blocke auf, mn davon mit m Elementen 2. Sortiere jede diese Blocke 3. Sei S 0 die Menge der mn lMediane der Blocke Bestimme rekursiv den Median 0j m j S dieser Mediane (also das 2 -kleinste Element). Nenne diesen Median s. 4. Partitioniere S ; fsg in S1 := fx 2 S : x < sg, S2 := fx 2 S : x > sg. Bemerkung: jS1 j jS2 j n4 , falls n 3m ; 1 S2 r >s r r r r r r r r r r r rs r r rg g r r J ^ g r r r r r r r g r rg r r r r r gr rg rg r r r r r r r r r <s r r S1 5. Falls i jS1 j, bestimme rekursiv das i-kleinste Element in S1 Falls i = jS1 j + 1, gib s als Losung zuruck. Sonst (falls jS2 j > n ; i) bestimme rekursiv das (i ;jS1 j; 1)-kleinste Element in S2 Komplexitatsbetrachtung (# Vergleiche im worst-case): Sei T(n) die worst-case Anzahl von Vergleichen fur jS j = n des Algorithmus BFPRT. Sei Cm die # von Vergleichen, um m Elemente zu sortieren (z.B. C5 = 7 C11 = 26). Es gilt: l m l n m n C + jnk 3 T(n) T m + T 4 n + m m 2 | {z } | |{z} {z } | {z } 3: 5: 2: 4: Satz: Der Selektions-Algorithmus BFPRT bestimmt das i-kleinste Element von n Elementen mit O(n) Vergleichen (und Zeit). Beweis: Behauptung: T(n) c n wobei c = c(m) konstant ist. KAPITEL 2. SELEKTIEREN UND SORTIEREN 67 Behauptung ist ok, falls n m + T 3 n + l n m C + j n k cn, dies gilt, falls T(n) T m 4 m m 2 lnm 3 n c + l n m C + j n k cn j 1 (Ind.A.) c + m 4 m m 2 n , (bis auf d e b c ) mc + 34 c + Cmm + 12 c , ; mc ; 43 c + c Cmm + 21 l Cm 1 , c 1 ;m 3 +; 2 1 4 Schlu bemerkung: m = 11 m 3 c = c(m) 20 2.3 Randomisierter-Median-Algorithmus Problem: Bestimme den Median von n Elementen: 1. Wahle n 43 Elemente zufallig aus dem n Elementen aus. 2. Sortiere diese n 34 Elemente mit einem n log n-Algorithmus. 3. Setze p1 := maxf n24 ; pn 1g-kleinsten Element der n 43 Elemente. 3 p2 := minf n24 + pn n 43 g-kleinsten Element der n 43 Elemente. 3 z S0 }| { S1 z ppp }| pp p1 4. Partitioniere n Elemente in S0 := fElemente < p1 g S1 := fp1 Elemente p2 g S2 := fp2 < Elementeg n n 43 { p ppp p z S2 }| { p2 5. Falls jS0 j n2 oder jS2 j n2 oder jS1 j 4 n 43 dann wiederhole den Algorithmus ansonsten sortiere S1 und liefer das n2 ; jS0 j-kleinste Element davon ab. Satz: Obiger Algorithmus bestimmt den Median von n-Elementen mit einer er3 warteten Anzahl von 2 n + o(n) Vergleichen. Beweis: i) Korrektheit: klar. KAPITEL 2. SELEKTIEREN UND SORTIEREN 68 ii) Anzahl der Vergleichen einer Iteration: O(n 34 log n 34 ) + Kosten der Partitionierung Kosten der Partitionierung: zu naiv, bessere Ansatz: S0 S1 p1 S2 p2 n-Elemente Wahle zuerst mit der Wahrscheinlichkeit je 12 aus, ob Element x mit p1 oder p2 verglichen wird, mache zwei Vergleiche nur, falls notig. Erwartete Anzahl Vergleiche dafur ist gleich: jS2 j 2 + n 1 jS2 j 1 + jS0 j + jS1 j 2 = = n 21 jSn0 j 1 + jS1 j + n 2 n n 0 z n }| { 1 jS0 j + jS2 j + 2 jS0 j + jS1 j + jS2 j +jS1j C = = n2 B @ A n n B C = n2 (1 ; n 14 + 2 + 2 n; 41 ) = 32 + o(n) Wir zeigen, da der Algorithmus mit der Wahrscheinlichkeit 1 ;O(n; 14 ) nur eine Iteration benotigt (daraus folgt, da insgesamt Anzahl der Vergleiche 32 n + o(n) ist). Dafur verwenden wir Hilfsmittel aus der Stochastik: Zufallsvariable (ZV): X , Werte 2 f0 1g (binare Zufallsvariable) mit X= 1 mit WS p 0 mit WS q = 1 ; p Erwartungswert einer ZV: E(X ) = Px2 WertebereichWS(X = x)x (X ist diskret, d.h. der Wertebereich von X ist endlich) Markov-Ungleichung : WS(X t) E(tX ) fur X nicht negativ Tschebysche-Ungleichung : WS(jX ;E(x)j t) Var(t2X ) Binomialverteilung : Seien X1 Xn unabhangige, identisch gleichverteilte Zufallsvariablen mit Wertebereich f0 1g, WS(Xi = 1) = p X := n X i=1 Xi X ist gema der Binomialverteilung verteilt, Wertebereich = f0 1 ng: WS(X = k) = nk pk (1 ; p)n;k E(X ) = n p Var(X ) = n p (1 ; p) = n p q: X ist verteilt gema der Binomialverteilung mit den Parametern n und p, in Zeichen X B(n p). KAPITEL 2. SELEKTIEREN UND SORTIEREN 69 wird wiederholt, falls jS0 j n2 . Dies passiert gdw. Auswahl der n 34 Elemente p 3 1 wir hochstens 2 n 4 ; n Elemente aus der Halfte der aller Elemente Median auswahlen. Was ist also die Wahrscheinlichkeit dafur, da keine neue Auswahl der n 43 Elemente stattnden mu ? Setze Binare Zufallsvariable fur jedes Xi Xn mit: Xi = 1 ,falls Element i ausgewahlt und in der unteren Halfte der Wert liegt 0 ,sonst P X = Xi binomialverteilt mit Parametern n und 12 n; 14 1 E(X ) = 21 n 34 , Var(X ) = n 12 ; 4 (1 ; 21 n; 14 ) = 21 n 34 (1 ; o(1)) Die Wahrscheinlichkeit hierbei ist: p p WS(jS0 j n2 ) = WS(X 12 n 34 ; n) WS(jX ; E(X )j n) 1 n 43 (1 ; o(1)) 1 1 2 n 2 n; 4 (1 ; o(1)) Die Wahrscheinlichkeit fur den Fall, da man von vorne anfangen mu : 1 1 ; 4 WS ) 1 ; 2 n (1 ; o(1)) Die anderen beiden Wahrscheinlichkeitsbedingungen (WS(jS2 j n2 ) und WS(jS1 j 4 n 43 )) ergeben analoge Abschatzungen ) Widerholung mit WS O(n; 14 ) 3 2.4 Der Schonhage-Paterson-Pippenger-Median-Algorithmus Denition: Sei k 2 Nnf0g: Pk ist die folgende partielle Ordnung: k s@: : : s: :;: s @g s; ;@ s;: : : s: :@: s z }| { | {z } k 2k + 1 Elemente s s@ ;s @g s; ; s ; s ; s; P3 Spezielle Binomialbaume mit "Zentren\. Denition: 1. Der Baum H0 besteht aus einem Knoten und dieser ist auch das Zentrum. 2. H2h (h > 0) besteht aus zwei H2h;1 , deren Zentren durch eine neue Kante verbunden sind. Das Zentrum des H2h ist das kleinere der beiden Zentren der H2h;1 : KAPITEL 2. SELEKTIEREN UND SORTIEREN 70 3. H2h+1 (h 0) besteht aus zwei H2h , deren Zentren durch eine neue Kante verbunden sind, sein Zentrum ist das gro ere dieser beiden Zentren. H0 H1 Hg s0 H2 H3 sg s ;s s s ; H0 ; ;s ss s H4 s s ;s s ; s ;s gss ; ;s s s s ; ; s s ; s s gs sg s s s ' ss ss $ gss ss ss ss gs # & % gs "! Das Zerlegungslemma: ; ; ; ; ; ; A ; s s ; A sA H2 s H0 H1 H3 A > < (Zentrum) (Zentrum) Abtrennung von Wildwuchs a) Hh hat 2h Knoten, es werden 2h ; 1 Vergleiche benotigt, um Hh zu konstruieren. b) H2h kann zerlegt werden in sein Zentrum KAPITEL 2. SELEKTIEREN UND SORTIEREN 71 eine Menge fH1 H3 : : : H2h;1 g von disjunkten Teilbaumen, deren Zen- tren alle gro er sind als das Zentrum von H2h . eine Menge fH0 H2 H4 : : : H2h;2 g von disjunkten Teilbaumen mit Zentren kleiner als das von H2h . c) H2k+1 kann so zerlegt werden, da die Zusammenhangskomponente des Zentrums genau 2k Knoten dem Zentrum enthalt, indem hochstens 2k+1 ; 1 Kanten entfernt werden. H2k kann so zerlegt werden, da die Zusammenhangskomponente des Zentrums genau 2k Knoten enthalt, die alle dem Zentrum sind, indem hochstens 2k ; 1 Kanten entfernt werden. d) Falls k 2h ; 1, dann kann H2h so zerlegt werden, da die Zusammenhangskomponente des Zentrums genau 2k +1 Elemente enthalt, von denen k gro er und k kleiner als das Zentrum sind () Pk ). Dazu genugt es, hochstens 3k + 2h Kanten zu entfernen. Die restlichen Zusammenhangskomponenten sind wieder Hi . Bemerkung: Bei jedem Konstruktionsschritt wird ein Vergleich durchgefuhrt, um zu bestimmen, welcher der beiden Teilbaume das kleinere Zentrum hat. Im Algorithmus von Schonhage, Paterson und Pippenger werden aus Teilstucken Hr gro ere Baume Hr+1 zusammengebaut, wodurch schrittweise eine partielle Ordnung auf den Eingabewerten bestimmt wird. Wurde ein Baum H2h hinreichender Gro e hergestellt, so wird er durch Zerlegung in einen Baum umgewandelt, der nur noch sein altes Zentrum, sowie k daruberliegende und k darunterliegende Elemente enthalt, wobei k 2h ; 1. Im folgenden Beispiel wollen wir H4 zerlegen und wahlen k = 3: s ; ; s ;s s s ; g s ; s s s ; s H4 s s ;; s s s s Um einen H4 derart zu zerlegen, mussen wir 5 Kanten aufbrechen. Dabei werden drei H0 , ein H1 sowie ein H2 abgespalten. ss s s g ; s ; ;; gs gs gss s s s s H1 H0 s H2 s g g s H0 H0 U brig bleibt die gewunschte Struktur mit k Knoten uber dem Zentrum und k unter dem Zentrum, wodurch eine partielle Ordnung auf 2k + 1 Eingabewerten bestimmt wurde: KAPITEL 2. SELEKTIEREN UND SORTIEREN k 72 s@: : : s: :;: s @s; s;: :;: @s: :@: s z }| { | {z } k 2k + 1 Elemente Die bei der Zerlegung angefallenen Reststucke werden beim Aufbau weiterer Baume benutzt. So geht das bereits angesammelte Wissen uber die Ordnung der Elemente nicht verloren. Beweis der Teile a) bis d) des Zerlegungslemmas: a) Lemma 1: Hr hat 2r Knoten, es werden 2r ; 1 Vergleiche benotigt, um Hr aufzubauen. Beweis: In jedem der r Konstruktionsschritte wird die Anzahl der Knoten verdoppelt. Da wir mit einem Knoten beginnen, hat Hr folglich 2r Knoten. Die Anzahl der notwendigen Vergleiche Cr unterliegt folgender Rekursionsgleichung (r 1): Cr = 1+2Cr;1 und C0 = 0. Damit folgt sofort Cr = 2r ;1. 3 b) Lemma 2: Hr kann in folgende disjunkte Bereiche unterteilt werden: { sein Zentrum, { eine Reihe H1 , H3, ..., Hr;1 (r gerade) bzw. ..., Hr;2 (r ungerade) von Unterbaumen, deren Zentren uber dem von Hr liegen, { eine Reihe H0 , H2, ..., Hr;2 (r gerade) bzw. ..., Hr;1 (r ungerade) von Unterbaumen, deren Zentren unter dem von Hr liegen. Beweis: durch Induktion uber r. Induktionsanfang: fur H0 gilt die Behauptung. Induktionsannahme: die Behauptung gelte fur Hr;1. 1. Sei r = 2h h > 0. H2h besteht aus zwei H2h;1 , wobei das kleinere der beiden alten Zentren das neue Zentrum z bildet. Wende auf den H2h;1 , der z enthalt, die Induktionsannahme an. Wir konnen diesen Unterbaum also in z , sowie H1 , H3 , ..., H2h;3 (Zentren uber z ) und H0 , H2 , ..., H2h;2 (Zentren unter z ) partitionieren. Zusammen mit dem H2h;1 , dessen Zentrum uber z liegt, ergibt sich die Induktionsbehauptung fur H2h . 2. Sei r = 2h + 1 h 0. H2h+1 besteht aus zwei H2h , wobei das gro ere der beiden alten Zentren das neue Zentrum z bildet. Wende auf den H2h , der z enthalt, die Induktionsannahme an. Wir konnen diesen Unterbaum also in z , sowie H1 , H3 , ..., H2h;1 (Zentren uber z ) und H0 , H2 , ..., H2h;2 (Zentren unter z ) partitionieren. Zusammen mit dem H2h , dessen Zentrum unter z liegt, ergibt sich die Induktionsbehauptung fr H2h+1 . 3 Wir bezeichnen im folgenden mit H2;h den Baum, der entsteht, wenn wir H2h so zerlegen, da alle Elemente oberhalb des Zentrums wegfallen. Mit H2+h+1 bezeichnen wir den Baum, der entsteht, wenn wir H2h+1 so zerlegen, da alle Elemente unterhalb des Zentrums wegfallen. c) Lemma 3: H2;h und H2+h+1 haben jeweils 2h Knoten. Bei der Herstellung aus H2h bzw. H2h+1 werden 2h ; 1 bzw. 2h+1 ; 1 Kanten aufgebrochen. Die wegfallenden Teile haben die Form Hs s < 2h bzw. s < 2h + 1. KAPITEL 2. SELEKTIEREN UND SORTIEREN 73 Beweis: Durch Induktion uber r. Induktionsanfang: fur H0 und H1 gilt die Behauptung. Induktionsannahme: die Behauptung gilt fur alle Hp p < r. 1. Sei r = 2h h > 0. Wir betrachten die Partitionierung von H2h mit Zentrum z wie in Lemma 2. Die Unterbaume H1 , H3 , ..., H2h;1 haben ihre Zentren oberhalb von z . Wir trennen sie von H2h , indem wir h Kanten aufbrechen. Die abgetrennten Teile haben oensichtlich die Form Hs s < 2h. Bei den Unterbaumen H0 , H2 , ..., H2h;2 , mit Zentren unterhalb von z , wenden wir jeweils die Induktionsannahme an, d.h. wir erzeugen H0; , H2;, ..., H2;h;2 . Als Ergebnis erhalten wir H2;h . Damit gilt fur die Zahl der aufzubrechenden Kanten K ;(2h) zur Herstellung von H2;h : K ;(2h) = h + hX ;1 i=0 K ;(2i) I:A: = h+ hX ;1 i=0 (2i ; 1) = hX ;1 i=0 2i = 2h ; 1: Fur die Zahl E ; (2h) der Elemente in H2;h gilt: E ; (2h) = 1 + hX ;1 i=0 E ; (2i) I:A: = 1+ hX ;1 i=0 2i = 1 + h X i=1 2i;1 = 2h : | {z } 2h ;1 2. Sei r = 2h + 1 h > 0. Wir betrachten die Partitionierung von H2h+1 mit Zentrum z wie in Lemma 2. Die Unterbaume H0 , H2 , ..., H2h haben ihre Zentren unterhalb von z . Wir trennen sie von H2h+1 , indem wir h + 1 Kanten aufbrechen. Die abgetrennten Teile haben oensichtlich die Form Hs s < 2h + 1. Bei den Unterbaumen H1 , H3 , ..., H2h;1 , mit Zentren oberhalb von z , wenden wir jeweils die Induktionsannahme an, d.h. wir erzeugen H1+ , H3+ , ..., H2+h;1 . Als Ergebnis erhalten wir H2+h+1 . Damit gilt fur die Zahl der aufzubrechenden Kanten K + (2h +1) zur Herstellung von H2+h+1 : h X K +(2h + 1) =h + 1 + K +(2(i ; 1) + 1) i=1 h h X X I:A: = h + 1 + (2i ; 1) = 1 + 2i i=1 i=1 hX +1 =1 + 2i;1 ;1 = 2h+1 ; 1: i=1 | {z } 2h+1 ;1 Fur die Zahl E + (2h + 1) der Elemente in H2+h+1 gilt: E + (2h + 1) = 1 + h X i=1 E + (2(i ; 1) + 1) I:A: = 1+ h X i=1 2i;1 = 2h: | {z } 2h ;1 3 KAPITEL 2. SELEKTIEREN UND SORTIEREN 74 d) Lemma 4: Falls k 2h ; 1, dann kann H2h so zerlegt werden, da die Komponente des Zentrums genau 2k + 1 Elemente enthalt, k davon uber und k unter dem Zentrum. Dazu mussen 3k + 2h Kanten entfernt werden. Die entfernten Teile sind von der Form Hs s < 2h. Beweis: Betrachte die Binardarstellung von k = k020 + k121 +::: + kh;12h;1 und die Partitionierung von H2h mit Zentrum z wie in Lemma 2. { Fur jedes i mit ki = 1, betrachte H2i+1 aus der Sequenz H1, H3, ..., H2h;1 von Unterbaumen deren Zentren oberhalb von z liegen und schneide alle Elemente aus H2i+1 , die kleiner als sein Zentrum sind (bilde also H2+i+1 ). Dazu mussen hochstens 2k Kanten aufgebrochen werden, denn jedes ki = 1 steht fur 2i in k, kostet uns aber nach Lemma 2 K + (2i + 1) = 2i+1 ; 1 Kanten, also: hX ;1 i=0 ki K + (2i + 1) 2k: Fur jedes i mit ki = 0, schneide H2i+1 ganz weg. Dabei werden hochstens h Kanten aufgebrochen. Genau k Elemente oberhalb von z bleiben zuruck, da jedes ki = 1 fur 2i in k steht, und ein H2+i+1 genau E + (2i + 1) = 2i Elemente enthalt, also: hX ;1 i=0 ki E + (2i + 1) = k: { Fur jedes i mit ki = 1, betrachte H2i aus der Sequenz H0, H2, ..., H2h;2 von Unterbaumen, deren Zentren unterhalb von z liegen und schneide alle Elemente aus H2i , die gro er als sein Zentrum sind (bilde also H2;i ). Dazu mussen hochstens k ; 1 Kanten aufgebrochen werden, denn jedes ki = 1 steht fur 2i in k und kostet uns nach Lemma 3 K ;(2i) = 2i ; 1 Kanten, also: hX ;1 i=0 ki (2i ; 1) k ; 1: Fur jedes i mit ki = 0, schneide H2i ganz weg. Dabei werden hochstens h Kanten aufgebrochen. Genau k Elemente unterhalb von z bleiben zuruck, da jedes ki = 1 fur 2i in k steht, und ein H2;i genau E ; (2i) = 2i Elemente enthalt, also: hX ;1 i=0 ki E ; (2i) = k: Damit ergibt sich fr die Gesamtanzahl aufzubrechender Kanten eine obere Schranke von 3k + 2h. Lemma 3 liefert uns daruberhinaus die gewunschte Aussage ber die Form der abgetrennten Teile. 3 Betrachte H2h "gro er\: H2h;1 H2h;3 : : : H1 "kleiner\: H2h;2 H2h;4 : : : H0 ss s s gss ss ss ss ss ss KAPITEL 2. SELEKTIEREN UND SORTIEREN 75 ;; ;; H h; ;;H H2h 2 ; ; 2 2h;2 U(h) := Anzahl der Elemente in H2h Zentrum: U(h) = 2U(h ; 1) = 2hU(0) = 2h D(h) := Anzahl der Elemente in H2h Zentrum: D(h) = 2D(h ; 1) = 2hD(0) = 2h Anzahl der Kanten, die entfernt werden mussen: Cu (h) 2 + 2Cu (h ; 1) = 2 + 4 + 23 + : : : + 2h = 2h+1 ; 2 Cd(h) 1 + 2Cd (h ; 1) = 2h ; 1 Kette von Pk 's: 9 > > > > = > > > > CH 2h+1 ; 2 + 2h ; 1 3 2h J ps p J top p p p J J sp p p p p p Pk J J s bottom J J Pk | J Pk {z t } Gesamtzahl der Elemente: n t(2k + 1) in den Pk 's r = n ; t(2k + 1) Rest Wenn r < t ; 1, dann wissen wir, da top gro er ist als k + (t ; 1)(k + 1) > k + (k + 1) 2nk++12 ; 1 = n ;2 1 ) top > Median j k k := n 41 h sdg. 2h;1 k < 2h KAPITEL 2. SELEKTIEREN UND SORTIEREN ¾ 76 ¾ $ % " ! " & # Deniere: r := Anzahl der noch im H2h Produktionsproze steckenden Elemente. 2hP ;1 2h (fur jedes i < 2h hochstens ein Hi ) r = 2 ; 1) i=0 R := Anzahl der im letzten Schritt zu sortierenden Elemente. Es gilt: t r +1, und damit R = t(2k + 1) + r 22h(2k + 1) + 22h ; 1 m := Gesamtzahl der im Algorithmus produzierten Pk 's. m = t + 2 2(nk;+R1) = t + nk ;+ R1 Gesamtzahl der vom Algorithmus durchgefuhrten Vergleiche = 1. Anzahl der Kanten in allen Pk 's 2. + Anzahl der Kanten, die geloscht werden, um die Pk 's zu formen 3. + Anzahl der Kanten, die zum Schlu in ubriggebliebenen Hi 's (i < 2h) stecken 4. + Anzahl der Vergleiche, um jedes Zentrum der Pk 's in die (sortierte) Kette einzufugen 5. + Anzahl der Vergleiche, um die zum Schlu ubriggebliebenenen R Elemente zu sortieren 3 2 nk ;+ R1 + t n 7 6 7 + log + 6 2 + 3 + 2 + log 5 | {z } |{z} 4|{z} | {z } 2 + 1 {z } | 3 1 2 5 k k h k 4 R R r KAPITEL 2. SELEKTIEREN UND SORTIEREN 77 k j k := n 14 , h so da 2h;1 k < 2h Damit r = O(k2 ) t = O(k2 ) zum Schlu R = O(k3 ), und damit die Anzahl der Vergleiche = T(n) 5n + o(n) Verbesserte Version: T (n) = 3n + o(n) Dor/Zwick: 2 95n + o(n) Bester bekannter Algorithmus: K.Zwick ( 2:95n + o(n) ) Literatur: SPP: Finding the Median. JCSS 13(1976) p.84-199 2.5 Eine untere Schranke fur die Medianbestimmung Satz: Jeder otigt in worst-case min (vergleichsbasierte) Medianalgorithmus ben destens 32n ; 2 Vergleiche Beweis: Gegenspielerargument (adversary argument) n Elemente, o.B.d.A. n ungerade, alle Elemente paarweise verschieden. Die Menge aller Elemente wird in drei Teilmengen partitioniert: U enthalt die Kandidaten fur den Median, G enthalt Elemente, die sicher gro er als der Median sind und L enthalt Elemente, die sicher kleiner als der Median sind. Anfangs sind alle Elemente in U . Der Algorithmus stellt nun Fragen der Form ai < aj . Der Gegenspieler gibt konsistente Antworten, die den Algorithmus jedoch dazu zwingen, moglichst viele Fragen zu stellen bevor die Antwort feststellen kann(d.h. U soll moglichst ungeordnet blei? ben). Durch die (konsisten!) Antworten des Gegenspielers auf die \ <\-Queries des Algorithmus entsteht ein DAG. Gegenspieler halt DAG \einfach\. (Angenommen y > z und y > x ) y soll sehr gro sein ) y ! G) G U a1 an | {z } saj s ai ai < aj L G U L a1 {z } | % an s bs G ;@ ; @ s KAPITEL 2. SELEKTIEREN UND SORTIEREN G n +2 1 ; 1 U a1 L 78 s s Solange ein Element unverglichen ist, s ist nicht klar, welches Median ist. an | {z } n +2 1 ; 1 Solange jLj jGj < n+1 2 , kann der Algorithmus annehmen, da der Median in U ist. Solange U mindestens zwei unverglichene Elemente und keine Zusammenhangskomponente mit > 2 Elementen enthalt, kann der Algorithmus den Median nicht bestimmen. Strategie des Gegenspielers: Zwei Phasen ? Erste Phase: Query sei x < y: i) x y 2 G bzw. x y 2 L: irgendeine konsistente Antwort ii) x 2 G ^ y 2 L U (bzw. x 2 L ^ y 2 G U ): Antwort: y < x (bzw. x < y). iii) x y 2 U ! Die erste Phase endet, wenn jLj = n;2 1 oder jGj = n;2 1 . Wahrend der Phase 1 enthalt U mindestens zwei (in U ) maximale und mindestens zwei (in U ) minimale Elemente (bzgl. des DAGs). ) Wahrend Phase 1 kann der Algorithmus den Median mit Sicherheit nicht bestimmen. Der Gegenspieler beginnt mit Phase 2: jLj wird n;2 1 oder jGj wird n;2 1 o.B.d.A.: jLj = n ;2 1 KAPITEL 2. SELEKTIEREN UND SORTIEREN 79 Der Gegenspieler zwingt nun den Algorithmus, das minimale Element in U bzgl. der gesamten totalen Ordnung zu bestimmen (da dieses unter den Vorgaben der Median ist). Analyse: C := Anzahl der Vergleiche P := Anzahl der Paare in U i) In der Phase 1 gilt folgende Invariante: C ; P + 2jU j 2n Beweis: vollstandige Induktion: Induktionsanfang: 0 ; 0 + 2n 2n Induktionsschritt: Gema der Tabelle. 3 ii) Sei C # der Vergleiche am Ende der Phase 1, U die am Ende der Phase 2: In der Phase 2 werden noch jU j ; 1 ; jP j Vergleiche notig. Die Anzahl der Vergleiche fur alle Phasen: Anzahl der Vergleiche C + jU j ; 1 ; jP j. Am Ende der Phase 1 gilt ja C 2n + jP j ; 2jU j (wg. Invariante). ) Anzahl der Vergleiche: 2n + jP j ; 2jU j + jU j ; 1 ; jP j = 2n ; jU j ; 1 32 n ; 32 = # $ 3 1 = 2 n ; 2 da jU j n + 2 3 2.6 Eine bessere untere Schranke Literatur: Samuel W. Bent, John W. John: \Finding the median requires 2n comparisons." Proceedings of the 17th Annual ACM Symposium on Theory of Computing 1985, p.213{216. Satz: Sei T ein Entscheidungsbaum hf;ur die Bestimmung des i-kleinsten von n i n 1 2 verschiedenen Elements, mit i log i n;i+1 + 3. Dann gilt, mit s % & p := 2 log ni n ; 1i + 1 + 3 ; 2 % & 2n;p Hohe(T ) log ni n ; i+1 Bemerkung: i = n2 ! ;d nn2 e O( p2nn ) ) Hohe(T ) 2n ; o(n) (untere Schranke fur Median). Beweis: Gegenspielerargument + Abzahlargument: T hat viele Blatter\, A Teilmenge der Schlussel, jAj = i T" A Teilbaum von T , alle Blatter von TA sind auch Blatter von T . Zu zeigen: TA hat viele Blatter. (;ni Moglichkeiten, TA's zu konstruieren, Anzahl Blatter in TA: 2n;p , jedes Blatt von T kommt in hochstens n ; i + 1 TA 's vor) KAPITEL 2. SELEKTIEREN UND SORTIEREN 80 Beobachtungen: Jedes Blatt w von T liefert folgende Informationen: liefert answer(w) ;;;! i-kleinstes Element x liefert little(w) ;;;! i ; 1 Elemente < x liefert big(w) ;;;! n ; i Elemente > x Wahle A als beliebige Teilmenge der n gegebenen Schlussel, mit jAj = i. Wir geben fur den Gegenspieler eine Strategie an, welche dazu fuhrt, da wir durch Zurechtschneiden aus T einen Baum TA konstruieren konnen, so da gilt: TA ist Binarbaum jedes Blatt von TA ist auch Blatt von T (keine zus. Blatter durch Abschneiden) fur jedes Blatt w von TA gilt: little(w) A Setze A* das Komplement von A, s % & r := log ni n ; 1i + 1 + 3 s := r ; 1 Es gilt: p = r + s ; 1 Die Konstruktion (das \Zurechtstutzen\) von T erfolgt in zwei Phasen: r r ;@ PPP P P r ; r Wurzel r xi <? yi r xj <? yj rx ; @ @ r ' $ r r Ar r gppr A c(x) p A* pp grp grp Agrp ppp p p p p p p pp % & pp ;;;;;; Vergleiche pp pp p p p p pp $ pp p p ' p p pp pp p p pr pr pr r A A A C( x ) # = s(x a) r Ar r fur a 2 A fest & % Erste Phase von der Wurzel nach unten (Breitensuche) Betrachte Knoten x. Deniere: C(x) sind die Elemente a 2 A fur die es kein b 2 A gibt und einen Knoten auf dem Pfad von der Wurzel von T zu x, an dem kein Vergleich mit einem anderen Element b 2 A erfolgt ist mit dem Ergebnis a < b. KAPITEL 2. SELEKTIEREN UND SORTIEREN 81 c(x) sind entsprechend die in x bekannten Minima in A*. s(x a) (a 2 A) ist die Anzahl der Elemente 2 A* (genauer: 2 c(x)) mit denen a auf dem Pfad von Wurzel von x verglichen wurde. Regeln fur Phase 1: Es werden in Knoten x die Elemente a und b verglichen: Regel 1.1: Falls a 2 A und b 2 A behalte x in TA bei. Regel 1.2: Falls a 2 A* und b 2 A* behalte x in TA bei. Regel 1.3: Sei o.B.d.A. b 2 A*, a 2 A. Ersetze den Unterbaum in T mit Wur- zel x mit dem Unterbaum, dessen Wurzel das Kind von x ist, das dem Ergebnis entspricht (d.h. lasse den Vergleich a < b aus, nach Voraussetzung A < A*). Phase 1 lauft solange jC(x)j r. Ein Knoten auf einem Pfad in T von der Wurzel, bei dem jC(x)j erstmals = r wird, hei t kritisch.Jeder Pfad in T von der Wurzel zu einem Blatt enthalt genau einen kritischen Knoten. Betrachte in TA einen Pfad von der Wurzel zu einem kritischen Knoten x. Sei y ein Knoten auf diesem Pfad, z sein Kind. r Wurzel ry rz rx Dann gilt: C(y) + c(y) C(z ) + c(z ) jC(z )j + jc(z )j jC(y)j + jc(y)j ; 1 Da jC(Wurzel)j = jAj = i und jc(Wurzel)j = jA*j = n;i, mussen uberhalb eines jeden kritischen Knoten x mindestens i ; jC(x)j + n ; i ; jc(x)j = n ; r ; jc(x)j Vergleiche erfolgen. Von jedem kritischen Knoten abwarts arbeitet der Gegenspieler nach einer Strategie fur Phase zwei. Sei x ein solcher kritischer Knoten. Dann ist jC(x)j = r. Phase 2: Sei a 2 C(x) ein Element mit minimalem s(x a). ' $ rA r r A rpgp Arppg p rpg r r r A* c(x) &p p p ppp p p p % p p pp p p $ ' pp p p p pp p r r r r AAa A # = s(x a) C( x ) r Ar r fur a 2 A fest & % Fall 1: s(x a) s. Betrachte irgendeinen Pfad von der Wurzel durch x zu einem Blatt w. Jeder solche Pfad mu mindestens n ; 1 Vergleiche enthalten, um answer(w) KAPITEL 2. SELEKTIEREN UND SORTIEREN 82 zu verizieren: n ; i, fur die answer(w) sich (direkt oder indirekt) als das kleinere Element ergibt, und i ; 1, wo es sich als das gro ere ergibt. Damit sind (r ; 1)s Vergleiche redundant (namlich alle die, die zwischen Elementen aus C(x) n fanswer(w)g und Elementen in A* erfolgt sind). Also: Tiefe(T ) n ; 1 + s(r ; 1) = n ; r ; s ; 1 + (s + 1)r " ;n # = n ; r ; s + 2 + log n ; ii + 1 % n;p & > log ni n ;2 i + 1 In diesem Fall folgt also die Behauptung direkt! Fall 2: s(x a) < s Fall 2.1: $ ' rA r A r Apg rp gppr r r r A* c(x) & p p p ppp % p p pp S ' p p pp $ rA p ppr r r A A # = s(x a) C( x ) r Ar X r XXr fur a 2 A fest & % jc(x)j p. Sei S := c(x) fagnElemente, die in s(x a) gezahlt werden. Der Gegenspieler antwortet nun so, da das Ergebnis das kleinste Element in S wird. Ist w ein Blatt in TA unter x, so ist little(w)= A ; fag Der Entscheidungsbaum T wird also gema folgender Regeln gestutzt (sei y der aktuelle Knoten und seien a und b die beiden Elemente, die in y verglichen werden): Regel 2.1: falls a b 2 S , dann bleibt y erhalten. Regel 2.2: andernfalls, sei oBdA. a 2 A n S oder b 2 A* n S ersetze y mit seinem Unterbaum durch das Kind von y und dessen Unterbaum, das der Antwort von a < b entspricht. Also, da uberhalb des kritischen Knoten x keine zwei Elemente in S verglichen wurden, mu der Unterbaum von TA unterhalb von x Tiefe jS j ; 1 haben. Zusammen mit Phase 1 ergibt sich eine Tiefe von TA: n ; r ; jc(x)j + jS j ; 1 n ; r ; jc(x)j + jc(x)j + 1 ; (s ; 1) ; 1 =n;r;s+1 =n;p KAPITEL 2. SELEKTIEREN UND SORTIEREN 83 Fall 2.2: jc(x)j < p. S := C(x) Regeln so, da der Algorithmus als Antwort das Maximum von S bestimmt. Tiefe von TA : n ; r ; jc(x)j + jS j ; 1 n ; r ; (p ; 1) + r ; 1 =n;p In Wirklichkeit: Jeder Pfad in TA von x zu Blatt hat mindestens die Lange n ; p. Also entha;lt jedes TA mindestens 2n;p Blatter (von T ). Alle TA's zusammen enthalten ni 2n;p Blatter von T , wobei jedes Blatt von T hochstens n ; i + 1 mal vorkommt: Sei w Blatt von T , dann ist little(w) eindeutig bestimmt und mu , falls TA w auch enthalt, little(w) A sein. Fur das Element; in A; little(w) gibt es nh; i +1 Moiglichkeiten ) Anzahl Blatter von T n;1i+1 ni 2nn;p ) Tiefe(T ) ; n;p log ni n2;i+1 . 3 Einige Referenzen: 1. L. Hyal: Bounds for selection. SIAM J.Compute 5(1976), p.109-114. 2. S. Beut and John W. John: Finding median requires 2n compression. Proc 17. STOC (1985), p.213-216. 3. John Welliaveetil John: A new lower bound for the set-partitioning problem. SIAM J. Compute 17 (1988), p. 640-647. 4. Doris Dor and Uri Zwick: Median selection requires (2 + ")n compression. Proc 37 FOCS (1996), p. 125-134 5. Doris Dor and Uri Zwick: Selecting the median Proc 6 SODA (1995), p. 28-37 2.7 Untere Schranke fur (vergleichbasiertes) Sortieren ? Gegeben n-Schlusseln, Queries ai < aj . Dies entspricht einen Entscheidungsbaum. ai <r aj ja;@nein r r @ ; R ; ;@ ak < ai ; ; @ ja;@nein @ ; R r r ;@ ; @ 0 (Permutationen) r ;@ ; @000 00 Beobachtung: Jede Permutation 2 Sn kommt in mindestens einem Blatt des Entscheidungsbaums vor (jSn j = n!).) Tiefe des Entscheidungsbaums log2 n!. KAPITEL 2. SELEKTIEREN UND SORTIEREN 84 p ; Stirling: n! 2n ne n hp n i ) Also Tiefe log2 2n ne = n log2 n ; n log2 e + 12 log 2n = n log2 n ; O(n) Satz: Jeder Vergleichsbasierter Sortieralgorithmus benotigt mindestens n log2 n ; O(n) Vergleiche. 2.8 Bucketsort im Schnitt Gegeben n-Schlusseln 2 0 1]. Schlusseln gleichverteilt. Um diese zu sortieren: 1. Initialisiere Buckets b0 b1 bn 2. Lege ai in Bucket dn ai e 3. Sortiere Schlussel innerhalb jedes Buckets 4. Kankataniere Buckets Satz: Wird zum Sortieren Sortieralgorithmus mit der Zeitkomplexitat von O(n2 ) verwendet, dann hat obiger Bucketsort-Algorithmus im Durchschnitt eine lineare Laufzeit. Beweis: Sei ni die Anzahl der Elemente im Bucket bi (nach Schritt 2). Die Schritte 1,2 und 4 benotigen zusammen die Zeit O(n). Die Zeit fur Schritt 3 betragt: n X O( i=0 n2i ) P Die Erwartungswert fur E n X i=0 n2 i ! c n2i la t sich folgenderma en abschatzen: X 0i<j n 0 WS(ai und aj enden in gleichen Bucket) 1 1 A = O(n): = c@ 0i<j n n + 1 X 3 2.9 Quicksort Wie bei vielen anderen Sortierverfahren (Bubblesort, Mergesort, usw.) ist auch bei Quicksort die Aufgabe, die Elemente eines Array a1::n] zu sortieren. Quicksort ist zudem ein Divide-and-Conquer-Verfahren. Devide: Wahle ein Pivot-Element p (z.B. das letzte) und partitioniere al::r] gema p in zwei Teile al::i ; 1] und ai + 1] (durch geeignetes Vertauschen der Elemente), wobei anschlie end ai] = p. Conquer: Sortiere al::i ; 1] und ai + 1::r] rekursiv. KAPITEL 2. SELEKTIEREN UND SORTIEREN 85 Algorithmus: a l r) proc qs( f lr then return fi if #ifdef Variante 2 vertausche random( )] mit ] #endif := ] := := repeat while and ] do + + od while and ] do od if then vertausche ] und ] until == vertausche ] und ] qs( 1) qs( + 1 ) a l r ar p ar i lj r g i<j i<j i<j i j ai a l i ; a i r ai p paj i j;; ai aj ar Bemerkung: Der oben formulierte Algorithmus benotigt pro Durchlauf in der Regel n +1 Schlusselvergleiche. Lediglich wenn die beiden Indizes zusammenfallen (was nur bei einem Pivotduplikat passieren kann), benotigt er nur n Vergleiche. Durch geschicktes Einstreuen von if-Abfragen kann man auch in jedem Fall mit n ; 1 Schlusselvergleichen auskommen. Komplexitat von Quicksort: Best-case-Analyse: Quicksort lauft naturlich am schnellsten, falls die Partitio- nierung moglichst ausgewogen gelingt, im Idealfall also immer zwei gleichgro e Teilintervalle entstehen, das Pivot ist dann stets der Median. n Anzahl der Schlusselvergleiche: log i=1 (n + 1) = log n(n + 1) n log n P Worst-case-Analyse: Z.B. bei eine aufsteigend sortierte Eingabe. Anzahl der Schlusselvergleiche: (n2 ) Average-case: Da die Laufzeit von Quicksort sehr stark von den Eingabedaten abhangt und sich demnach keine scharfe allgemeingultige Schranke angeben la t, kann man die Frage stellen, wie lange der Algorithmus \im Mittel\ zum sortieren von n Elementen braucht. Um jedoch uberhaupt eine derartige Analyse durchfuhren zu konnen, mu man zuerst die genaue Bedeutung von \im Mittel\ festlegen. Eine naheliegende Annahme ist, da alle moglichen Permutationen der Eingabedaten mit gleicher Wahrscheinlichkeit auftreten. Satz: Die durchschnittliche Anzahl von Schlusselvergleichen betragt unter der Annahme , da alle Permutationen fur die Eingabe gleichwahrscheinlich sind, hochstens: Cn = 2(n + 1)(Hn+1 ; 1) 2n ln n ; 0:846::n + o(n) 1:386n log n P wobei Hn := ni=1 i;1 die n-te Harmonische Zahl ist. KAPITEL 2. SELEKTIEREN UND SORTIEREN 86 Beweis: (Variante mit n ; 1 Vergleiche pro Durchlauf) Sei Cn die Anzahl der Vergleichen bei dem Feld der Lange n. C0 = C1 = 0. Cn = n ; 1 + n1 n X j =1 (Cj;1 + Cn;j ) Da i) fur festes j 2 f1 ng das Produkt (in beiden Varianten) das j kleinstes Element ist und ii) auch fur die rekursiven Aufrufe wieder alle Eingabepermutationen gleichwahrscheinlich sind: ) Cn = n ; 1 + n2 nX ;1 nCn = n2 ; n + 2 Cj j =0 nX ;1 j =0 Cj (n ; 1)Cn;1 = (n ; 1)2 ; (n ; 1) + 2 nX ;2 j =0 Cj nCn ; (n ; 1)Cn;1 = 2n ; 1 ; 1 + 2Cn;1 nCn = 2n ; 2 + (n + 1)Cn;1 = n(n1+ 1) n ; 1 Cn;1 Cn n + 1 = 2 n(n + 1) + n = = 2 n(nn;+11) + 2 (nn;;1)2 n + nCn;;12 = = 2 n(nn;+11) + + C32 = 2 3 n j;1 X = 2 4 j (j + 1) 5 = j =2 = 2 n X 4 2 2 j =2 j 1 j (j + 1) ; j (j + 1) 3 5 = 3 n 1 X 3 4 = 2 Hn+1 ; 2 ; ; (j +1 1) 5 = j j =2 % & 3 1 1 = 2 Hn+1 ; 2 ; 2 ; (n + 1) = % & 1 = 2 Hn+1 ; 2 + (n + 1) 1 Hn ln n + 0:57721 + o(1) ) Cn = 2(n + 1) Hn+1 ; 2 + n+1 ) Cn 2n ln n ; 4n + o(n) 1:386n log n 3 Kapitel 3 Minimale Spannbaume 3.0 Grundlagen Ein Graph G = (V E ) besteht aus einer Menge von Knoten V und einer Menge Kanten E . Die Anzahl der Knoten bezeichnen wir mit n (jV j = n), die Anzahl der Kanten mit m (jE j = m). Eine Kante (v v) 2 E hei t Schlinge. Falls E eine Multimenge ist, spricht man von Mehrfachkanten. Kanten (u v) und (v u) hei en antiparallel. Graphen ohne Schlingen und Mehrfachkanten bezeichnen wir mit einfachen Graphen (eng. simple). Formal deniert: E V 2 =: fX V jX j = 2g In diesem Fall bezeichnet man G = (V E ) als einen ungerichteten Graphen. Graphische Darstellung: v4t K5 Vollstandiger bipartit, K33 v3 t PP PP D Z v5 D ZZ PP v3DD ZZAA ``` D```` ZZA v2 J J D ``Z `A J D J D J D v1 JD t t tv6 H ; @HH ; @ H ; HH v2 @ ; HH v5 HH @ ;@ H ;H H@ ; H@ H@ v1 ; H v4 t t t t t t Ist E V V , dann hei t G gerichteter Graph, fur (u v) 2 E : s u - s v Der zu G gehorige ungerichtete Graph ist G0 = (V E 0 ). E 0 erhalt man, indem man in E die Richtungen wegla t und Mehrfachkanten beseitigt. Sei v 2 V , unter der Nachbarschaft N (v) := fw (v w) 2 E g eines Knotens v versteht man die Menge der direkten Nachbarn von v. Der Grad eines Knotens ist deniert als: N (v)j falls G ungerichtet und deg(v) = jindeg (v) + outdeg(v) falls G gerichtet. 87 KAPITEL 3. MINIMALE SPANNBAUME 88 Dabei sind indeg(v) die Anzahl aller Kanten, die v als Endknoten haben, und outdeg(v) die Anzahl aller Kanten, die v als Startknoten haben. P Beobachtung: v2V deg(v) = 2jE j Korollar: In jedem Graphen ist die Anzahl der Knoten mit ungeradem Grad eine gerade Zahl. Das Komplement G = (V V2 ; E ) eines Graphen G = (V E ) besitzt die gleiche Knotenmenge V und hat als Kantenmenge alle Kanten des vollstandigen Graphen ohne die Kantenmenge E . Ein Graph H = (V 0 E 0 ) hei t Teilgraph (aka. Subgraph, Untergraph, ...) von G = (V E ), falls V 0 V und E 0 E . H hei t (knoten-) induzierter Teil 0 V 0 graph, falls H Teilgraph von G ist, und es gilt E = E \ 2 . Ein Kantenzug ist eine Folge e1 := fv0 v1 g el := fvl;1 vl g, wobei alle ei verschieden sind. v0 und vl bezeichnen wir als Endknoten. Die Lange des Kantenzuges bezeichnen wir mit l. Sind bei einem Kantenzug auch alle vi verschieden, so sprechen wir von einem Pfad. Ein Kantenzug mit vl = v0 hei t Zykel. Ein Zykel, in dem alle vi verschieden sind, hei t Kreis. Ein Graph G hei t zusammenhangend, wenn es fur alle u v 2 V einen Pfad gibt, der u und v verbindet. Ein (kanten-) maximaler zusammenhangender Teilgraph hei t (Zusammenhangs-)Komponente. $ K4 ' $ s ;s K1 AA ; A ; s s s As s; s & % & % 3 K2 s K' s Ein Graph G ist azyklisch, wenn er keine Kreise enthalt. Wir bezeichnen diesen dann als Wald. Ist dieser auch zusammenhangend, so sprechen wir von einem Baum. Ist der Teilgraph T = (V E ) G = (V E ) ein Baum, dann hei t T ein Spannbaum. Satz: Ist T = (V E ) ein Baum, dann ist jE j = jV j ; 1. Beweis: Induktion uber die Anzahl der Knoten: n = 0 1 : klar. n ! n + 1 : Sei v 2 V , jV j = n + 1 V 0 = V ; fvg deg(v) = 1. Solche Knoten mussen existieren, denn ansonsten wurde ein Zykel entstehen, und das ware ein Widerspruch zur Denition eines Baumes. 3 Korollar: Ein Graph G ist zusammenhangend, g.d.w. G ein Spannbaum hat. KAPITEL 3. MINIMALE SPANNBAUME 89 3.1 Traversierung von Graphen Sei G = (V E ) ein ungerichteter Graph. Anhand eines Beipiels betrachten wir die zwei Algorithmen DFS (Tiefensuche) und BSF (Breitensuche). 3.1.1 DFS-Algorithmus 9 v unvisitet do pick(random) unvisited node push onto stack while stack = do := pop the top element if not visited then mark visited push all neigbour's of onto stack DFS Ops( ) fi od while r := r v 6 v v v v od Beispiel fur DFS: 1t g2t 1gQBB QQ Q 2Q B Q B Q 8g Q B B Q *t7 Q B B g Q 7 QB t B 8H 6HH B g g Bt6 t 3 gt? 9H 3A 9@ I ;6 ; @ A @g ; A g 5@ t -; AUt4 4 5 Die markierten Kanten bilden einen Spannbaum: s 1g 2g s s 3g Ruckwartskanten s 4g s 5g ;@ ; s 6g @s 7g s 8g s 9g Wir betrachten nun den Stackzustand: Im Zustand g) sind die Elemente 2, 3 und 5 als visited markiert (siehe Zustande b), c) und e)). Deswegen werden sie aus dem KAPITEL 3. MINIMALE SPANNBAUME 90 Stack entfernt und so wird das Element 8 zum obersten Stackelement. Im Zustand j) sind alle Elemente markiert, so da eins nach dem anderen aus dem Stack entfernt werden. : Oberstes Stackelement : Nachbarn h : Schon besuchte Knoten Zustand: g) j) a) b) c) d) e) f) visited h) i) visited ? ? ? ? ? ?6h ? ? ?6h Stack: 1 2 8 7 3 9 8 1 8 7 4 9 2 9 8 1 8 7 5 3 9 2 9 8 1 8 7 9 8 6 4 3 9 2 9 8 1 8 7 2 3h 5h 8 6 4 3 9 2 9 8 p 1p p p 7 6 5 2 1 6 4 3 9 2 9 p 8p p p 3.1.2 DFS-Algorithmus while 9 v unvisitet do pick(random) unvisited node push into queue while queue = do := remove front element of queue if not visited then mark visited append all neigbour's of to end of queue BFS Ops( ) fi od r := r v 6 v v v v od Beispiel fur BFS: tg 1 gt Q 1B Q 2 B Q Q 2BQQ B Q 4 B Q B s Q 7 Q B B Q 3 QBN B 8 HHH B 6 BN 5 j 7H 3A 9@ ;6 @ ; A @ ; A @; ?8 AU 9 t g tg tg 4 tg 5 tg tg gt 6 8 1 6 5 2 1 6 4 3 9 p 2p p p 7 8h 5h 8h 1h 6h 5h 2h 1h 6h 4h p 3php p KAPITEL 3. MINIMALE SPANNBAUME 91 Die markierten Kanten bilden einen Spannbaum: 1 gs gpsp p p p p p p p p p p p p p p p p sp gp p p p p p p p p p p s4g pp p p gpsp p p p p p p p p psp gp p p p p gp p sp p p p p p p p p p sp p g pp p p p g ps p p H B HH B HH 2 B3 H J J J J 6 J5 8 J 7 J ; YH ; H J R u ckwartskanten J 9 Wir betrachten nun den Queuezustand: Im Zustand e) sind die Elemente 1 und 8 als visited markiert (siehe Zustande a) und c)). Deswegen werden sie aus der Queue entfernt, und so wird das Element 9 das vorderste Queueelement. Das gleiche passiert in den Zustanden g), h) und i). Im Zustand j) sind alle Elemente markiert, so da sie eins nach dem anderen aus der Queue entfernt werden. : Vorderstes Queue-Element : Nachbarn i : Schon besuchte Knoten Queue: Zustand: 1 (a 2 8 7 (b 8 7 1 8 9 3 (c 7 1 8 9 3 1 2 6 7 5 (d visited 1ii 8 9 3 1 2 6 7 5 1 8 6 3 1 2 6 7 5 1 8 6 5 3 2 visited 1ii 2 6 7 5 1 8 6 5 3 2 4 9 2 visited 7i5 1 8 6 5 3 2 4 9 2 7 8 5 visited 1iiiiii 8 6 5 3 2 4 9 2 7 8 5 6 8 9 4 visited 9iiiiiiiiiii 2 7 8 5 6 8 9 4 5 3 3.2 Minimale Spannbaume (e (f (g (h (i (j Sei G = (V E ) ungerichteter einfacher Graph gegeben mit folgenden Eigenschaften: w : E ! R eine Gewichtsfunktion, E 0 E : w(E 0 ) = Pe2E0 w(e), T = (V 0 E 0 ) ein Teilgraph von G mit w(T ) = w(E 0 ), sei o.B.d.A. G zusammenhangend, dann deniere: KAPITEL 3. MINIMALE SPANNBAUME 92 Denition: T hei t minimaler Spannbaum (MSB) von G, falls T Spannbaum von G ist und gilt: w(T ) w(T 0 ) Beispiel: q 7 1 q@ 4 2 q@ 6 q ; 8@ ;3 @; q moglicher q Spannbaum @ @ ; ; ;5 q q q ; ; ; ; q;; Anwendungen: Telekom: Telefonvermittlungen Leiterplatinen q q 3.2.1 Konstruktion von minimalen Spannbaumen Es gibt zwei Prinzipien fur die Konstruktion von minimalen Spannbaumen(Tarjan): "blaue\ Regel "rote\ Regel Satz: Sei G = (V E ) ein zusammenhangender, ungerichteter Graph, w: E ! R eine Gewichtsfunktion, C = (V1 V2 ) ein Schnitt (d.h. V = V1 V2 , V1 \ V2 = , V1 6= 6= V2 ). Sei EC = E \ (V1 V2 ) die Menge der Kanten "uber den Schnitt hinweg\. Dann gilt: ("blaue\ Regel) 1. Ist e 2 EC die einzige Kante minimalen Gewichts (uber alle Kanten in EC ), dann ist e in jedem minimalen Spannbaum fur (Gw) enthalten. 2. Hat e 2 EC minimales Gewicht (uber alle Kanten in EC ), dann gibt es einen minimalen Spannbaum von (Gw), der e enthalt. Beweis: durch Widerspruch 1. Sei T ein minimaler Spannbaum von (Gw), sei e 2 EC die minimale Kante. Annahme: e 2= T . Da T Spannbaum ) T \ EC 6= . Sei T \ EC = fe1 e2 : : : ek g k 1. Dann enthalt T feg einen eindeutig bestimmten Kreis (den sogenannten durch e bzgl. T bestimmten Fundamentalkreis). Dieser Kreis mu mindestens eine Kante 2 Ec \ T enthalten, da die beiden Endpunkte von e auf verschiedenen Seiten des Schnitts C liegen. Tr Ar Ar Ar V1 e e 0 r rj j r j V2 r HH H AH H 0 HA e ;@ ; @ A ; @ ; @A e ;@ ; @ r j r r r r r j KAPITEL 3. MINIMALE SPANNBAUME 93 Sei e0 2 Ec \ T . Dann gilt nach Vorraussetzung w(e0 ) >w(e). Also ist T 0 := T ; fe0g feg ein Spannbaum von G, der echt kleineres Gewicht als T hat, Widerspruch zu T ist minimaler Spannbaum. 2. Sei e 2 Ec minimal. Annahme: e kommt in keinem minimalen Spannbaum vor. Sei T ein beliebiger minimaler Spannbaum von (Gw). rj jr r V1 e rj rjr V2 e2 = T \ E 6= c e 2= T \ Ec 6= . Sei e0 2 Ec \ T eine Kante auf dem durch e bezuglich T erzeugten Fundamentalkreis. Dann ist T 0 = T ; fe0g feg wieder ein Spannbaum von G, und es ist w(T 0) w(T ). Also T 0 minimaler Spannbaum und e 2 T 0. 3 Satz: Sei G = (V E ), w : E ! R, ein gewichteter, zusammenhangender Graph. Dann gilt: ("rote\ Regel) 1. Gibt es zu e 2 E einen Kreis C in G, der e enthalt und w(e) > w(e0 ) 8e0 2 C n feg erfullt, dann kommt e in keinem minimalen Spannbaum vor. 2. Ist c1 = e1 : : : ek ein Kreis in G und w(ei ) = maxfw(ej )j1 j kg, dann gibt es einen minimalen Spannbaum, der ei nicht enthalt. Beweis: 1. Nehmen wir an, da es einen minimalen Spannbaum T gibt, der e = fv1 v2 g enthalt. Wenn wir e aus T entfernen, so zerfallt T in zwei nicht zusammenhangende Teilbaume T1 und T2 mit vi 2 Ti , i = 1 2. Da aber e auf einem Kreis in G liegt, mu es einen Weg von v1 nach v2 geben, der e nicht benutzt. Mithin gibt es eine Kante e^ 6= e auf diesem Weg, die einen Knoten in T1 mit T2 verbindet. Verbinden wir T1 und T2 entlang e^, so erhalten wir einen von T verschiedenen Spannbaum T^. Wegen w(^e) < w(e) folgt w(T^) < w(T ). Ein Widerspruch. 2. Wir nehmen an, ei liege in jedem minimalen Spannbaum (MSB) von G, und zeigen die Behauptung durch Widerspruch. Sei T ein beliebiger MSB von G. Entfernen wir ei aus T , so zerfallt T in zwei nicht zusammenhangende Teilbaume T1 und T2 . Da ei auf einem Kreis c1 = e1 : : : ek in G liegt, konnen wir wie unter 1. ei durch eine Kante ej des Kreises c1 ersetzen, die T1 und T2 verbindet. Dadurch erhalten wir einen von T verschiedenen Spannbaum T~, der ei nicht enthalt. Da nach Voraussetzung w(ej ) w(ei ) gilt, folgt w(T~) w(T ) (und sogar w(T~) = w(T ), da T nach Annahme ein MSB ist). Also ist T~ ein MSB von G, der ei nicht enthalt, im Widerspruch zur Annahme, ei liege in jedem MSB von G. 3 Literatur: R.E. Tarjan: \Data Structures and Network Algorithms", SIAM CBMSNSF Reihe Bd. 44. KAPITEL 3. MINIMALE SPANNBAUME 94 3.2.2 Generischer minimaler Spannbaum-Algorithmus Initialisiere Wald F von Baumen, jeder Baum ist ein singularer Knoten. (jedes v 2 V bildet einen Baum) while Wald F mehr als einen Baum enthalt do wahle einen Baum T 2 F aus bestimme eine leichteste Kante e = fv wg aus T heraus sei v 2 T w 2 T 0 vereinige T und T 0, fuge e zum minimalen Spannbaum hinzu od T T0 # # qHq Hqq q q q q "! "! T 00 # T 000 Wald F # q q q qq q "! "! V1 V2 3.3 Kruskals Algorithmus algorithm Kruskal p (Gw):= G F fT i : : : ng V E V fv : : : v g T i fv wg L x 2F y 2F x6 y v w y n jV j T fv g L v w x y ffv wgg jxj jyj x v w x y x x L sortiere die Kanten nach aufsteigendem Gewicht in eine Liste initialisiere = i =1 Wald ( = ) mit i = i co = ( ), = 1 oc n co implementiere i 's als in-Trees mit den jeweiligen Wurzeln als Repr asentanten allgemein: Unio-Find-Problem oc MSB:= for := 1 to length( ) do := i := Baum , der enth alt co :=Find( ) oc := Baum , der enth alt co :=Find( ) oc if = then co und in verschiedenen B aumen oc MSB:=MSB if then co Baum enth alt Knoten als Baum y oc co :=Union( ) oc else vereinige und , mit neues Kind der Wurzel von fi fi od y y x KAPITEL 3. MINIMALE SPANNBAUME 95 Korrektheit: Falls die Gewichte eindeutig sind (w() injektiv), folgt die Korrektheit direkt aus der \blauen\ und \roten\ Regel. Ansonsten Induktion uber die Anzahl der Knoten (jV j): p Ind. Anfang: jV j klein: Sei r 2 R, Er := fe 2 E w(e) < rg. Es genugt zu zeigen: Sei r 2 R, sei T1 Tk ein minimaler Spannwald (d.h. Spannwald minimalen Gewichtes) fur Gr := fV Er g (d.h.betrachte nur Kanten mit Gewicht > r). Sei T ein MSB von G, dann: Hilfsbehauptung: Die Knotenmenge eines jeden Ti im T induziert einen zusammenhangenden Teilbaum. Beweis der Hilfsbehauptung: Sei Ti =: (Vi Ei) und sei e 2 Vi Vi . Falls e 2 Ti , dann ist nichts zu zeigen. Fur den Fall e 62 Ti betrachte den Fundamentalkreis C , den e in Ti erzeugt. Gewicht aller Kanten auf C ;feg < r . Falls die beiden Endpunkte von e in T durch einen Pfad verbunden sind, der eine Kante e0 2 E ; Er enthalt, dann liefert die \rote\ Regel, da T nicht minimal ist. ) Die beiden Endpunkte und e sind in T durch einem Pfad aus lauter Kanten mit 3 Gewicht < r verbunden. Zeitkomplexitat: (mit n = jV j m = jE j) Sortieren m log m = O(m log n) O(m) Find -Operationen O(m log n) n ; 1 Unions O(n) Satz: Kruskal's MSB-Algorithmus hat die Zeitkomplexitat von O((m + n) log n) Beweis: s.o. 3 Beispiel fur Kruskals Algorithmus: t 4 t 8 11 7 t 8 2 t 1 6 t 7 4 t + t 8 t 4 h 2 h 4 2 t 11 t 6 7h 7 8 h t 11 t t 14 t 9 t 10 2 minimaler Spannbaum 7 t 6h 9 5h 8h 14 t 4 10 3h t 2 KAPITEL 3. MINIMALE SPANNBAUME 96 3.4 Prim's Algorithmus, erste Variante algorithm PRIM-MSB p (Gw) := V initialisiere Priority Queue PQ mit Knotenmenge und Schl ussel w ahle Knoten als Wurzel (beliebig) Schl ussel ] := 0 Vorg anger ] := nil while = do := FindMin( ) DeleteMin( ) for alle Knoten , die in zu benachbart sind do if and w( ) Schl ussel ] then Vorg anger ] := Schl ussel ] := w( ) fi od od r r r u PQ 6 PQ PQ v v 2 PQ x G v v u fu vg < u v fu vg Beispiel fur Prim's Algorithmus (erste Variante): 1t v + v0 0 t 4 1tv 7 tv +1 4t 1 v7 t 8 1 ;;t 8 v1 ;;ti v7 8 t 8 v1 2 v8 6 8 1 6 5 tv +1 +1 t 2 v8 2 7 v6 6 t tv +1 +1 t 7 v2 t +1 +1 t 10 9 2 Ausgangszustand: 1 alle Schl ussel = + aktueller Knoten (= u): Startknoten: r (= v0 ) it 10 14 t t +1 v4 9 +1 v3 PQ u PQ PQ u v v < v v suche := FindMin( ) und entferne aus setze Schlussel der Nachbarn in mit w(f g) Schlussel ]: ( 6 = 8) u t +1 v4 10 suche := FindMin( ) und entferne aus setze Schlussel der Nachbarn in mit w(f g) Schlussel ]: ( 1 = 8 7 = 4) u v3 v5 4 t 4 14 2 tv 1 + 3 v5 v6 +1 9 14 4 +1 8t 6 1t v + 4 v2 1 7 7 2 1 +1t 11 1t v 8 +1 ;;ti 11 7 t 8 v0 2 + 11 8 v0 7 4 + 8 PQ u PQ PQ u v v < v +1 8v 2 V KAPITEL 3. MINIMALE SPANNBAUME 1 v0 ;;t ;;t 11 8 t 7 v1 8 1 v0 ;;t ;;t v7 11 8 t 7 v1 7 1 v0 ;;t ;;t v7 11 8 t 7 v1 7 1 v0 ;;t ;;t v7 11 8 t 7 v1 1 1 v0 ;;t 8 2 v7 ;;t v7 11 7 t ;;i v1 2t 2 v8 ;;ti 7 v6 6 7t v5 14 4 t v2 t 1 +1 2 4 2 3 ;;t 7 7t ;;ti 6 v6 v8 t v2 6 2 3 ;;t ;;t v8 6 v6 t v2 2 2 3 ;;t v8 v6 ;;ti 2 3 ;;t v2 v8 6 7t 2 ;;ti 7 7t v6 ;;t v2 ;;t 5 t10 v4 suche := FindMin( ) und entferne aus setze Schlussel der Nachbarn in mit w(f g) Schlussel ]: ( 1 = 7 2 = 6) PQ u PQ PQ u v < v v suche := FindMin( ) und entferne aus setze Schlussel der Nachbarn in mit w(f g) Schlussel ]: ( 2 = 2 4 = 10) PQ u PQ PQ u v < v v suche := FindMin( ) und entferne aus setze Schlussel der Nachbarn in mit w(f g) Schlussel ]: ( 1 = 1) PQ u PQ PQ u v < v v suche := FindMin( ) und entferne aus setze Schlussel der Nachbarn in mit w(f g) Schlussel ]: solche Nachbarn existieren nicht u 9 14 ;;t v v u v3 7t < v v 10 v5 4 6 10 14 7 t10 v4 9 u v u v3 v5 PQ v v3 14 5 t +1 v4 9 PQ u 10 v5 4 6 1 ;;t 7 4 1 ;;t t 4 PQ u v v3 14 2 t +1 v4 9 suche := FindMin( ) und entferne aus setze Schlussel der Nachbarn in mit w(f g) Schlussel ]: ( 3 = 4 5 = 7 8 = 2) u 10 v5 4 1 9 97 t10 v4 10 v3 PQ u PQ PQ u v < v KAPITEL 3. MINIMALE SPANNBAUME 1 v0 ;;t 8 1 v0 ;;t 8 ;;t 11 ;;t v8 7 ;;t v1 ;;tv 7 11 ;;t 2 3 v7 7 v6 6 ;;t 2 3 ;;t v v2 8 7 ;;t v 1 6 5 7 6 ;;tv 6 2 ;;t 5 t9 10 t 8 ;;itv ;;t v 10 PQ u PQ PQ u v < v v v3 ; v; 5 suche := FindMin( ) und entferne aus setze Schlussel der Nachbarn in mit w(f g) Schlussel ]: ( 4 = 9) u v4 14 4 ;;tv 9 14 4 6 ;;ti v5 98 Endzustand: 4 suche u := FindMin(P Q) und entferne u aus P Q, damit ist P Q leer und der Algorithmus beendet 3 Korrektheit: ist klar. Zeitkomplexitat: n ; 1 DeleteMin O(m) sonstige Operationen inclusive DecreaseKey Implementierung der Priority Queue mittels Fibonacci-Heaps: Initialisierung O(n) Find + DeleteMins O(m) ( m Stuck) DecreaseKeys O(m) ( m Stuck) Sonstige Overhead O(1) ) Laufzeit: O(n) + O(n log(n)) + m O(1) + m O(1) = O(m + n log n) Satz: Sei G = (V E ) ein ungerichteter Graph (zusammenhangend, einfach) mit Kantengewichten w. Prim's Algorithmus berechnet, wenn mit Fibonacci-Heaps implementiert, einen minimalen Spannbaum von (G w) in Zeit O(m + n log n) (hier: n = jV j m = jE j). Dies ist fur m = (n log n) asymptotisch optimal. 3.5 Prim's Algorithmus, zweite Variante Idee: Lasse die Priority Queues nicht zu gro werden. Sei G = (V E ) jV j = n jE j = m, w Gewichtsfunktion, k Parameter, der unten festgelegt wird. Der Algorithmus wird in den folgenden Phasen abgearbeitet: 1. Initialisiere eine Schlange von Baumen, jeder Baum anfangs (Super-) Knoten. Zu jedem Baum: Priority Queue (Fibonacci-Heap) mit den Nachbarn der Knoten im Baum, die selbst nicht im Baum sind. Schlussel: Gewicht einer leichtesten Kante zu einem Knoten im Baum. KAPITEL 3. MINIMALE SPANNBAUME 99 2. Markiere jeden Baum in der Schlange mit der Nummer der laufenden Phase 3. while vorderster Baum in der Schlange hat laufende Phasennummer do lasse ihn wachsen, solange seine Priority Queue weniger als k Elemente enthalt (und noch was zu tun ist) if Priority Queue zu gro then fuge Baum mit Phasennummer + 1 am Ende der Schlange ein od 4. Falls "Phasensprung\: Schrumpfe alle Baume zu Superknoten, reduziere Kantenmenge (Behalte zwischen zwei Knoten, jeweils nur die leichteste Kante). 5. nachste Phase! t It t t t t t j t t t t t t t wenn ?gro genug hinten anstellen . . . Endemarkierung Endemarkierung falls Phasensprung ? schrumpfen und nachste Phase Betrachte Schlange von Baumen: vr r Ti Tt T1 T2 r @r ; r (Arbeit pro Phase # Knoten, au er Vereinigung zweier Superknoten T1 und T2 .) Fur jeden (Super-)Knoten v in T2 's Priority Queue: p 1. v 2 T1 : (nichts zu tun) 2. v in Priority Queue von T1, einfugen bzw. conditional DecreaseKey. Hilfsdatenstruktur: fur alle Knoten in den Priority Queues ein Zeiger auf den Superknoten, in dessen Priority Queue der Knoten letztmals am Anfang der Schlange stand. 3. sonst: Einfugen Betrachte Knoten mit "Halbkanten\: jede Halbkante kommt nur 1x in den Baumen vor. Mit m Kanten ergeben sich 2m Halbkanten, d.h. Anzahl proportional zu m. KAPITEL 3. MINIMALE SPANNBAUME vr e;; ; rm ! vr e;; und ; e;; =b ; r 2m Halbkanten Kanten 100 vr e;; ; r Kante aus zwei Halbkanten Zeitaufwand pro Phase: (+ Superknoten zu Beginn) Initialisierung: O(m) Delete und DeleteMin: t sonstige Priority Queue-Operationen, Overhead: O(m) Da die Priority Queues hochstens k Elemente enthalten, wenn darauf eine Priority Queue-Operation durchgefuhrt wird, sind die Kosten pro Phase O(t log k + m) Setze k = 2 2mt (damit t log k = m). Damit sind die Kosten pro Phase O(m). Wieviele Phasen? Sei t die Anzahl der Superknoten am Anfang einer Phase, t0 diese Zahl zu Beginn der nachsten Phase. Sei a die durchschnittliche Anzahl ursprunglicher Knoten in den t Priority Queues zu Anfang der Phase, a0 entsprechend zu Beginn der nachsten Phase. Wir haben: 1. a = 2m t 2 0 2. t km (mit Ausnahme ev. der letzten Phase) Also: a0 = 2m k = 2 2tm = 2a t0 Fur die erste Phase ist a = 2nm , a ist fur jede Phase n ; 1. Also ist die Anzahl der Phasen 1 + min i log(i) (n ; 1) 2m 2 n n o Setzen wir (m n) := min i log(2i) n mn , dann gilt (m n) log n fur n m n2 Satz: Fur gewichtete, zusammenhangende Graphen mit n Knoten, m Kanten kann ein minimaler Spannbaum in Zeit O(minfm (m n) m + n log ng) bestimmt werden. Euklidische minimale Spannbaume stellen ein Problem dar, fur das es speziellere Algorithmen gibt. Literatur hierzu: A.C.-C. Yao: Constructing Minimum Spanning Trees in k-dimensional spaces and related problems. SIAM Journal on Computing 11(4) p. 721{736 (1982). Kapitel 4 Kurzeste Pfade 4.1 Grundlegende Begrie Betrachte Digraph G = (V A) oder Graph G = (V E ). r Kante von ungerichtetem Graph r r6 =b r? Entgegengesetzte (antiparallele) Kanten Distanzfunktion: d : A ;! R+ (bzw. ;! R) O.B.d.A.: A = V V , d(x y) = +1 fur Kanten, die eigentlich nicht vorhanden sind. dis(v w) := Lange eines kurzesten Pfades von v nach w 2 R+ f+1g Arten von kurzeste-Pfade-Problemen: 1. single-pair-shortest-path ( spsp). Beispiel: Kurzeste Entfernung von Munchen nach Frankfurt. 2. single-source-shortest-path: gegeben G, d und s 2 V , bestimme fur alle v 2 V die Lange eines kurzesten Pfades von s nach v (bzw. einen kurzesten Pfad von s nach v) ( sssp). Beispiel: Kurzeste Entfernung von Munchen nach allen anderen Gro stadten. 3. all-pairs-shortest-path ( apsp) . Beispiel: Kurzeste Entfernung zwischen allen Gro stadten. Bemerkung: Es gibt keinen Algorithmus, der das single-pair-shortest-path berechnet, ohne nicht gleichzeitig das single-source-shortest-path-Problem zu losen. 4.2 Das single-source-shortest-path-Problem Zunachst nehmen wir an, da d 0 ist. Alle kurzesten Pfade von a nach b sind o.B.d.A. einfache Pfade. 101 KAPITEL 4. KURZESTE PFADE 102 4.2.1 Dijkstra's Algorithmus r Gegeben: G = (V A) (A = V V ) Distanzfunktion d : A ! R+ f+1g. Startknoten s. G durch Adjazenzlisten dargestellt. 0 rs A A A CC ; ; C r r r r rr algorithm sssp:= p S fsg s v 2 V n fsg v 2 V ; fsg v s PQ, die s v) := dis ] := 0 initialisiere eine Priorityqueue alle Knoten enth alt mit Schl ussel dis ] := d( for alle do from ] := od while = do := ExtractMin( ) := for alle , d( ) do if dis ] + d( ) dis ] then DecreaseKey( ] + ( )) co DecreaseKey ver andert dis ] oc from ] := fi od od v S v S6 V PQ S fvg w 2 V ; S v w < 1 v v w < w w dis v d v w w w v x Seien n = jV j und m := Anzahl wirklicher Kanten: Laufzeit (mit Fibonacci-Heaps): Initialisierung: O(n) ExtractMin: n O(log n) Sonstiger Aufwand: m ; O(1) (z.B. DecreaseKey ) ) Zeitbedarf also: O(m + n log n) Korrektheit: Wir behaupten, da in dem Moment, in dem ein v 2 V ;fsg Ergebnis der FindMin Operation ist, der Wert disv] des Schlussels von v gleich der Lange eines kurzesten Pfades von s nach v ist. Beweis: durch Widerspruch: Sei v 2 V ; fsg der erste Knoten, fur den diese Behauptung nicht stimmt und sei sr sr -1 s r : :: srr -2 vr -1 v r : :: vqr -2 vr - ein kurzester Pfad von s nach v, mit einer Lange < disv]. Dabei sind s1 : : : sr 2 S , s -s1 : : : sr -v1 v1 2= S r = 0 und/oder q = 0 ist moglich]. Betrachte Pfad seine Lange ist < disv], fur q 1 (ebenso fur q = 0) ist also disv1 ] < disv], Widerspruch zur Wahl von v. 3 r r r r KAPITEL 4. KURZESTE PFADE 103 Beispiel fur Dijkstra-Algorithmus: 1s v 2 v31s 5 @ @ @ 1 6 @ @ @ 1 0 @ 3 @ @ 3 @ v@ 1 v7 @ @2 @ @ 1 @ 4 v4 3 @ v6 v@@ 2 s s s s 1 s 1 v3 6s 5 3@ @ @ @ 1 6 @ @ 1 0 @ 3 @ @ 3 @ v@ 1@ v7 @ @ @2 @ 1 @ @ @ 4 3 v @ @ 4 R @ @ v2 v6 sf s s s s 1 2 v3 5s 1 1s 2 v 5 @ @ @ 1 6 @ @ @ 1 0 @ 3 @ @ 3 @ v@ 1@ v7 @ @ @2 @ 1 @ @ @ 4 3 v @ 4 R @ @ v@ v 2 6 s s sf s 2 s 1 6 v3 5sf s s s s s s 6 markiere (v3 v5 ) setze disv5 ]=2+3+5=7 markiere (v3 v6 ) setze disv6 ]=2+3+3=8 setze v5 als Bezugsknoten, da d(v3 v5 ) < d(v3 v6 ) fs s 5 7 s s s markiere (v2 v3 ) unmarkiere (v1 v3 ), da d(v1 v2 ) + d(v2 v3 ) < d(v1 v3 ) setze disv3 ]=2+3=5 markiere (v2 v4 ) setze disv4 ]=2+4=6 setze v3 als Bezugsknoten, da d(v2 v3 ) < d(v2 v4 ) 8 2 - v5 v3 @ @ @ @ @ @ @ 1 6 @ @ @ @ 0 @ 3 @ @ R8 @ 3 @ v@ 1@ v7 @ @2 @ @ @ @ 1 @ 4 3 v @ @ 4 @ R @ R @ v2 v6 2 markiere (v1 v2 ) setze disv2 ]=2 markiere (v1 v3 ) setze disv3 ]=6 setze v2 als Bezugsknoten, da d(v1 v2 ) < d(v1 v3 ) 7 2 - v5 @ @ @ @ @ 1 6 @ @ @ 1 0 @ 3 @ @ 3 @ v@ 1@ v7 @ @ @2 @ @ @ 1 @ 4 - v4 3 @ @ R @ v6 R @ v@ 2 2 setze disRest]=+1 1 1s v 2 gegeben Graph G v1 ist der Startknoten setze v1 als Bezugsknoten setze disv1 ]=0 s 6 s 8 markiere (v5 v7 ) setze disv7 ]=2+3+2+1=8 alle Knoten wurden erreicht: ) Algorithmus zu Ende KAPITEL 4. KURZESTE PFADE 104 Beobachtung: ExtractMin liefert eine monoton steigende Folge von Schlusseln dis ] Die Schlussel in PQ sind stets disv]+ C , wobei v das Ergebnis der vorangehenden ExtractMin-Operation (bzw. s zu Beginn) und C := maxuv2A fd(u v)g ist. Satz: Dijkstra's Algorithmus (mit Fibonacci-Heaps) lost das Single-SourceShortest-Path-Problem in Zeit O(m + n log n). Bemerkung: 1. Verwendet man Dijkstra's Algorithmus mit d-Heaps, so erhalt man Laufzeit O(m log2+ mn n) 2. Mikkel Thorup (STOC '98): O(m) 4.2.2 Dikstra's Algorithmus mit Radix-Heaps S s r vr vr0 r r r r +1 - H Y 6 HH disv0 ] d(v) 2 0 ::: C ] (alle Werte sind zwischen disv] und nC ) disv] r r r r r disv] e r r disv0 ] Einstuge Radix-Heaps: Menge von B = dlog2 (C + 1)e + 2 Buckets (jeder Bucket als doppelt verkettete Liste implementiert). Jeder Bucket hat Gro e size, mit 8 < 1 fur i = 1 fur i = 2 : : : B ; 1 size(i) = : 2i;2 nC + 1 fur i = B Beobachtung: j ;1 X i=1 size(i) minfsize(j ) C + 1g fur j = 2 : : : B Wir ordnen den Buckets Intervalle zu, indem wir fur jeden Bucket i eine obere Intervallgrenze u(i) angeben. Das Intervall fur Bucket i ist dann u(i ; 1) + 1u(i)]. KAPITEL 4. KURZESTE PFADE 105 Setze zu Beginn u(0) := ;1. Die u(i) andern sich im Algorithmus, die size(i) bleiben konstant. Zu Beginn: + Gro e des dem Bucket i u(i) := 2i;1 ; 1 fur i = 1 : : : B ; 1 zugeordneten Intervalls: u(B ) := nC + 1 u(i) ; u(i ; 1) size(i) Initialisierung: Einfugen aller Schlussel in die Buckets: Durchlaufe, fur Schlussel k, die Buckets B , B ; 1, : : : bis wir Bucket j nden mit u(j ) < k. Fuge k in Bucket j + 1 ein. Kosten: n log C . DecreaseKey : Wie bei Insert, beginne Suche mit momentanem Bucket des Schlussels. Kosten fur alle DecreaseKey Operationen: O(1) pro DecreaseKey +O(n log C ). DeleteMin: Suche von links den ersten nicht leeren Bucket j . Falls j = 1 ist alles ok (wegen size(1)=1). Falls j 2: Suche minimales Element v im Bucket j (v wird als FindMin zuruckgegeben und aus der Priority Queue geloscht), verteile alle anderen Elemente im Bucket j auf die Buckets 1 : : : j ; 1, nachdem die u(i)'s, wie folgt, aktualisiert wurden: u(0) := disv] ; 1 u(1) := disv] u(i) := minfu(i ; 1) + size(i)u(j )g fur i = 2 : : : j ; 1 verkettete Liste disv] minimal von Elementen A ; ; 1 2 3 4 AU r r vsr r r @ I KA ; ; @A @A; disw] disv] 1 r i 2r i r Y3 r i 4 + s @ ; ; @ v Kosten fur alle DeleteMins : O(log C ) pro DeleteMin + O(n log C ). Gesamtkosten fur Dijkstra's Algorithmus mit einstugen Radix-Heaps damit: O(m + m + n log C + n log C + n log C ) = O(m + n log C ) Satz: Dijkstra's Algorithmus mit einfstugen Radix-Heaps hat Zeitkomplexitat O(m + n log C ). Verbesserungen: 1. zweistuge Heaps: O(m + n logloglogCC ) p 2. mehrstuge Heaps (+Fibonacci-Heaps): O(m + n log C ) Literatur: Akuja, Mehlhorn, Orlin, Tarjan Faster Algorithms for the Shortest Path Problem. J ACM 37(1990), S. 213-223). KAPITEL 4. KURZESTE PFADE 106 4.2.3 Bellman-Ford-Algorithmus Dieser Algorithmus ist ein Beispiel fur dynamische Programmierung. Sei Bk i] := Lange eines kurzesten Pfades von s zu Knoten i, der hochstens k Kanten enthalt. Gesucht ist Bn;1 i] fur i = 1 n, Menge der Knoten V = f1 ng Initialisierung: 8 < d(s i) falls d(s i) < 1 i 6= s falls i = s +1 sonst B1 i] := : 0 Iteration: for k = 2 to n ; 1 do i = 1 ton do Bk i] := 0min for od j 2N (i) fBk;1 i] Bk;1 j ] + d(j i)g falls i = s sonst od Korrekheit: klar (Beweis durch vollstandige Induktion) Zeitbedarf: Wenn die innere Laufschleife durch eine Schleife uber alle Kanten ersetzt wird: Zeitbedarf: O(n m) 4.3 Floyd's Algorithmus fur das All-pairs-shortestpath-Problem Auch genannt "Kleene's Algorithmus\. Dieser Algorithmus ist ein weiteres Beispiel fur dynamische Programmierung. Sei G = (V E ) mit Distanzfunktion d:A ! R+0 gegeben. Sei o.B.d.A. V = fv1 : : : vn g. Sei ckij := Lange eines kurzesten Pfades von vi nach vj , der als innerer Knoten (alle bis auf ersten und letzten Knoten) nur Knoten aus fvi vk g enthalt. algorithm floyd:= p co 8i : dii = 0 i j od c(0) := dij for alle ( ) do ij for := 1 to do for alle ( ),n 1 k c(k) od n i j i j n c(k;1) ij := min ij od x Laufzeit: O(n3 ) od do c(k;1) + c(k;1) ik kj 1 i j n o KAPITEL 4. KURZESTE PFADE 107 Korrektheit: (k) Zu zeigen: cij des Algorithmus = ckij (damit sind fur k = n die Kosten der kurzesten Pfade durch c(ijk) gegeben). Beweis: Richtig fur k = 0. Induktionsschlu : Ein kurzester Pfad von vi nach vj mit inneren Knoten 2 fv1 : : : vk+1 g enthalt entweder vk+1 gar nicht als inneren Knoten, oder er enthalt vk+1 genau einmal als inneren Knoten. Im ersten Fall wurde dieser Pfad also bereits fur c(ijk) betrachtet, hat also Lange c(ijk) . Im zweiten Fall setzt er sich aus einem kurzesten Pfad P1 von vi nach vk+1 und einem kurzesten Pfad von P2 von vk+1 nach vj zusammen, wobei alle inneren Knoten von P1 und P2 2 fv1 : : : vk g sind. Also ist die Lange des Pfades = c(ikk)+1 + c(kk+1) j . 3 Satz: Floyd's Algorithmus fur das All-pair-shortest-path-Problem hat Zeitkomplexitat O(n3 ). 4.4 Digraphen mit negativen Kantengewichten 4.4.1 Grundsatzliches Betrachte Startknoten s und einen Kreis C mit Gesamtlange < 0 und C ist von s aus erreichbar. k4 t st 1 - t 3 - tp p p p p k ;5 Q Q 1 Q + t k0 J J1 J ^ J k1 t 2- C 1 Q t Q k3 1 - t -v tk2 Sollte ein Pfad von s nach C und von C nach v existieren, so ist der kurzeste Pfad nicht deniert. Falls aber die Gesamtlange des Kreises C 0 ist, k4 t st 1 - t 3 - tp p p p p k Q 1 ;3 Q Q + t k0 J J1 J ^ J k1 t 2- Q 1 t Q k3 1 - t -v tk2 dann ist der kurzeste Pfad wohl deniert. Probleme gibt es also nur dann, wenn es einen Zyklus negativer Lange gibt. Nichtsdestotrotz funktioniert Dijkstra-Algorithmus bei negativen Kantenlangen nicht. ws s; s 3; ; ;@ ; 4 @ ;2 @ v @ @ s KAPITEL 4. KURZESTE PFADE 108 Bei diesem Beispielgraphen (der nicht einmal einen negativen Kreis enthalt) berechnet der Dijkstra-Algorithmus die minimale Entfernung von s nach w falchlicherweise als 3 (statt 2). 4.4.2 Modikation von Bellman-Ford-Algorithmus Bk i] gibt nun die Lange eines kurzesten gerichteten s-i-Pfades an, der aus hochstens k Kanten besteht. Jeder beliebige Kantenzug, der keinen Kreis enthalt, besteht aus maximal n ; 1 Kanten. In einem Graphen ohne negative Kreise gilt daher: 8i 2 V : Bn i] Bn;1 i] Gibt es dagegen einen (von s aus erreichbaren) negativen Kreis, so gibt es einen Knoten i 2 V , bei dem ein Kantenzug aus n Kanten mit der Lange Bn i] diesen Kreis hauger durchlauft als jeder Kantenzug aus maximal n ; 1 Kanten der Lange Bn;1 i]. Demnach gilt: Bn i] < Bn;1 i] Man kann also in den Algorithmus aus Bellman-Ford einen Test auf negative Kreise einbauen, indem man in der Rekursion auch 8i 2 V : Bn i] berechnet und direkt vor der Ausgabe den folgenden Befehl einfugt: for i n do B i] < Bn;1 i] 1 to if n then stop. 4.4.3 Modikation von Floyd's-Algorithmus Falls kein negativer Kreis existiert, funktioniert der Algorithmus weiterhin korrekt. v1 t vt2 6 * HH H 1 1 ;6 t t H j v3 H 1 Y HH1 v6 H tv5 t ? 1 v4 HH c616 = 5 = c516 c661 = ;6 = c561 c611 = minfc511 c516 + c561 g = ;1 ) der Graph enthalt einen negativen Kreis, g.d.w. ein cnii < 0 existiert. Man kann also in den Algorithmus von Floyd einen Test auf negative Kreise einbauen, indem man direkt vor der Ausgabe den folgenden Befehl einfugt: for i n do c < 0 then 1 to if n ii stop. 4.4.4 Der Algorithmus von Johnson Denition: Sei d : A ! R eine Distanzfunktion. Eine Abbildung r : V ! R hei t Rekalibrierung, falls gilt: 8(u v) 2 A : r(u) + d(u v) r(v) KAPITEL 4. KURZESTE PFADE 109 Beobachtung: Sei r eine Rekalibrierung (fur d). Setze d0(u v) := d(u v) + r(u) ; r(v). Dann gilt: d0 (u v) 0 Sei u = v0 ! ! v1 = v ein Pfad. Dann ist: d-Lange = r X i=1 Demnach ist: d0 -Lange = = = d(vi vi;1 ) r X i=1 r X i=1 r X i=1 d0 (vi vi;1 ) (d(vi vi;1 ) + r(vi ) ; r(vi;1 )) = d(vi vi;1 ) + r(vr ) + r(v0 ) Also ist ein d-kurzester Pfad von u(v0 ) nach v(vr ) auch ein d0 -kurzester Pfad und umgekehrt. Man kann jetzt mit Hilfe von d0 beliebige Algorithmen (Dijkstra, Floyd, etc.) anwenden. Berechnung einer Rekalibrierung: a-Algorithmus. s s 0 0 0 ' $ sw d:A!R su Graph G & v s Fuge einen neuen Knoten s hinzu und verbinde s mit jedem anderen Knoten v 2 V durch eine Kante der Lange 0. % Berechne sssp von s nach allen anderen Knoten v 2 V (z.B. mit Floyd). Sei r(v) die dadurch berechnete Entfernung von s zu v 2 V . Dann r Rekalibrierung, denn es gilt: r(u) + d(u v) r(v) 4.5 Zusammenfassung d0 d allgemein ASSP Dijkstra (Fibonacci): O(mp+ n log n) Bellman-Ford: O(n m) Dijkstra (Radix) O(m + n log C )p apsp Dijkstra: O(n m + n2 minflog n log C g) Johnson: O(n m + n2 log n) Floyd: O(n3 )() Floyd: O(n3 ) Bemerkung(): In der Praxis ist der Floyd-Algorithmus bei kleinen n besser als Dijkstra-Algorithmus. KAPITEL 4. KURZESTE PFADE 110 4.6 Transitive Hulle 4.6.1 Min-Plus-Matrix-Produkt und Min-Plus-Transitive Hulle Ring R(+ ) % - Semiring N(+ ) % - Gruppe Halbgruppe Halbgruppe Halbgruppe Semiring uber R f1g mit Operationen min und +, jeweils Halbgruppe. Distributivgesetz a + minfb cg = minfa + b a + cg Normale Matrixmultiplikation: A = (aij )1ijn B = (bij )1ijn I = (ij )1ijn C = A B = (cij )1ijn cij = Entsprechend fur Min-Plus: cij = minfaik + bkj 1 k ng ur1 Z ur2 Z r r n X k=1 aik bkj aik = d(vi uk ) = d(uk wj ) HHZ bkj Z .XXH HZ X XH .. XZ X H vi XXX wj u n XXX r r Anwendung: A = B kurzeste Wege von vi nach wj in einem Graph (A = B ) 0 Imin+ = B @ 0 1 ... 11 0 C A Sei A Entfernungsmatrix, A = (aij )1ijn = (d(vi vj ))1ijn . Setze aii = 0 fur i = 1 : : : n. Betrachte A2 (Min-Plus-Produkt): A2 = (a(2) ij )1ij n . Dann ist a(2) ij die Lange eines kurzesten Pfades von vi nach vj , der hochstens zwei Kanten enthalt. Induktion: a(ijk) ist die Lange des kurzesten Pfades von vi nach vj mit hochstens k Kanten. Falls die d(vi vj ) alle 0, gibt es immer kurzeste Pfade, die n ; 1 Kanten enthalten. Alternative Losung des All-Pairs-Shortest-Path-Problems: Berechne An;1 (MinPlus). Es genugt auch A2dlog(n;1)e (nicht A2 A3 A4 : : : berechnen, sondern wiederholt quadrieren). A := mini0 fAi g hei t Min-Plus-Transitive Hulle. Bemerkung: Min wird Komponentenweise gebildet. Wenn d 0, dann A = An;1 . KAPITEL 4. KURZESTE PFADE 111 4.6.2 Boolesche Matrixmuliplikation und Transitive Hulle Ersetze in 4.6.1. Distanzmatrix durch (Boolesche) Adjazenzmatrix und ersetze MinPlus durch _ ^, d.h.: C = A B cij = n _ k=1 aik ^ bkj Setze aii = 1 1 i n Dann gilt fur Ak (Boolesches Produkt, A0 = I ) 8 > > < aij = > > : 1 falls es im Graphen einen Pfad von vi nach vj bestehend aus k Kanten gibt 0 falls es im Graphen keinen Pfad von vi nach vj bestehend aus k Kanten gibt Transitive Hulle A := _ i0 Ai ist damit die Adjazenzmatrix der transitiven Hulle des zugrundeliegenden Graphen (= An;1 ). Satz: Sei M(n) die Zeitkomplexitat fur das Boolesche Produkt zweier n n Matrizen, T(n) die Zeitkomplexitat fur die transitive Hulle einer n n Booleschen Matrix. Falls T(3 n) {z cT(n}) und |M(2n) {z 4M(n}), dann gilt: | sicher erfullt, falls T polynomiell sicher erfullt, falls M(n) n2 T(n) = !(M(n)) Beweis: Matrixmultiplikation "1 transitive Hulle: Gegeben: A B Gesucht: C = A B (Boolesches Produkt) Setze: 19 0 0 A 0 = L = @0 0 B A 3n 0 0 0 | {z 3n } L ist Adjazenzmatrix eines tripartiten, gerichteten Graphen, denn: u v w ur1 vr1 wr1 u v w : XXX XX u 0 A 0 z X *.. .. A ... B v 0 0 B . . w 0 0 0 r un 1x y bedeutet "reduziere x auf y\ r - vn r wn KAPITEL 4. KURZESTE PFADE 112 Daher kann L leicht bestimmt werden: 0 1 I A AB L = @0 I B A 0 0 I Also gilt: M(n) T(3n) = O(T(n)). Transitive Hulle " Matrixmultiplikation Gegeben: L nn Boolesche Matrix gesucht: L Annahme: n ist Zweierpotenz. Teile auf: B L = CA D |{z} |{z} n2 g n2 L = E F g n2 G H n2 Dann gilt: E = (A _ BD C ) betrachte alle Pfade von der ersten Halfte F = EBD G = D CE H = D _ GF der Knoten zur ersten Halfte der Knoten analog analog analog Um L zu berechnen, benotigen wir zwei Transitive-Hulle-Berechnungen und sechs Matrixprodukte fur Matrizen der Dimension n2 n2 , plus Aufwand fur _, der c0 n2 ist. Also: T(n) 2T( n2 ) + 6M( n2 ) + c0 n2 jBehauptung: jBeweis: j 2cM( n2 ) + 6M( n2 ) + c0 n2 jVorauss.: j 41 (2c + 6 + 4c0 )M(n) cM(n) T(n) cM(n) durchpInduktion: n=1 M(2n) 4M(n) M(n) n2 falls c 41 (2c + 6 + 4c0 ), also falls c 3 + 2c0 . Also T(n) = O(M(n)). 3 4.6.3 Der 4-Russen-Algorithmus fur Boolesche Matrixmultiplikation Autoren: V.L. Avlazarov, E.A. Dinic, M.A. Kronod, I.A. Faradzev : \On economical construction of the transitive closure of a directed graph", Soviet Math. Doklady 11 (1970), p. 1209{1210. Gegeben zwei Boolesche n n Matrizen A, B gesucht: C = A B . Sei l := blog nc, o.B.d.A. gelte ljn (l ist Teiler von n). KAPITEL 4. KURZESTE PFADE 113 j-te Spalte C cij ppp =i-te Zeile A ppppppppppppppppppp Teile A auf (setze m := nl ): B n B1 B2 l l l l n A1 A2 A nl ppp pp ppp ppp ppp ppp pp l l l l .. . Bm Sei A = A01 _ A02 _ _ A0m Ci := Ai Bi fur i = 1 : : : m. Dann gilt C= m _ i=1 Ci da C =AB = m _ i=1 A0i ! m _ i=1 ! Bi0 = _ 1im 1jm A0i Bj0 = m _ i=1 Ai Bi da Ai Bj = 0 fur i 6= j (fasse Ai und Bj als n n Matrizen auf mit 0 au erhalb des jeweiligen Streifens). Gegeben die Ci 's, benotigen wir Zeit O(mn2 ). Betrachte eine Zeile von Ci : Ai Ci c(ki) = = c(ki) k-te Zeile k 010110 n Bi b(ji) 0 1 0 1 1 0 n l l _ j =1 l a(ki) b(ji) Der Algorithmus berechnet einfach zunachst alle Booleschen Linearkombinationen der Zeilen von Bi (Prozedur bcomb) und damit c(ki) fur jedes mogliche a(ki) . Betrachte A, B und C als Matrizen von Zeilenvektoren: 0 a1 1 0 b1 1 0 c1 1 B.C B.C .C A=B @ .. A B = @ .. A C = @ .. A an bn cn i proc bcomb(int ) = p : : : 0] j 2blog nc ; 1 do p := blog j c co p Index der vordersten combj ] :=combj ; 2p ] _ b(i;1)blog nc+p+1 comb0] := 0 for := 1 to od x 1 von j oc KAPITEL 4. KURZESTE PFADE 114 Zeitbedarf: (a) sequentiell: O(n2 ) (b) Vektoroperationen der Breite n: O(n) algorithm four-russians(array p a b c a b c) = sind als Vektor von co die Matrizen const = log co wir nehmen an oc array comb0 2l;1] of boolean-vector l b nc :: for for i := 1 to n do ljn ci] := 0 : : : 0] n Zeilenvektoren organisiert oc od to nl do co Berechne die i 's oc bcomb( ) for := 1 to n do co Bitmuster in der -ten Zeile von i in Bin arzahl wandeln oc := 0 for := downto ( 1) + 1 do if ] then := + + 1 else := + fi od ] := ] comb ] od i := 1 j C i nc cj j k il a j k cj_ nc A i; l nc nc nc nc nc nc od x Beispiel: .. . Ai .. . k-te 010110 Zeile 6 6 Spalte Spalte (i ; 1)l + 1 il 0 1 0 1 1 0 Bi Zeitbedarf: (a) sequentiell: ; ; O nl n2 + n(l + n) = O nl3 = O logn3n (b) Vektorrechner der Breite n (Interpretation eines Bitintervalls als Zahl in O(1) Zeit): ; O nl (n + n(1 + 1)) = O logn2n (Vektoroperationen) Satz: Der 4-Russen Algorithmus berechnet das Produkt zweier Boolescher Ma3 2 n n trizen sequentiell in Zeit O log n bzw. mit O log n Vektoroperationen. Beweis: p (s.o.) 3 KAPITEL 4. KURZESTE PFADE 115 4.6.4 Transitive Hulle und DFS Tiefensuche(DFS): proc DFS-visit(node p v v) = markiere num ] := ++ for alle Nachbarn von do if unmarkiert then DFS-visit( od v count u u v u) fi x algorithm DFS = p v) num( for alle Knoten do if unmarkiert then DFS-visit( od fi for alle Knoten count := 0 v do unmarkiere( v v v) v) := 0 od x Bemerkung: Funktioniert fur Graphen und Digraphen. Nachbarn in Graphen und Digraphen: vr ur u Nachbar von v v Nachbar von u vr r -u u Nachbar von v Beispiele fur DFS: Graph G1 : q q q 1 q q q q5 9q ; ;; ! q q q q q q 4 q ;q8 q q 10q; 11q q q 6 Digraph G2 : 1q qI ;@ ;I q; ;@q6 q DFS ;2 q@; q65 7q ;@ q;@I @R; q;- q ;q?@;;;!6 qI; @R3q -4 q ;q@?8 @q; q; @R10q q; @R q 11q 9 ;@ ; @ DFS ;@ ; @ @ ; ;@ @; ; @ ; 2; @ 3 7@ @ ; @; Bezeichnungen: - Baumkan. Ruckwartskan. Querkan. Vorwartskan. Bemerkung: Alle Baumkanten zusammen ergeben den DFS-Wald (Spannwald). KAPITEL 4. KURZESTE PFADE 116 ' SZK1 qI $ ;@ qkSZK5 ; q @q q ;@ ; ?q ; Rq -; @ k q q & % SZK2 ;@ ;@ I ; Rk @ ; q k q q @q SZK3 SZK4 SZK6 + Schrumpfen der SZK's DAG (Directed Acyclic Graph) 5 1 @ Senke + 2 @ Quelle ? @ R ? 3 4 6 q qk qk qk q qk e Bemerkung: SZK: starke Zusammenhangskomponente (in Digraphen) DFS in ungerichteten zyklischen Graphen, n Knoten, m Kanten, n ; 1 Baumkanten, m ; n + 1 Ruckwartskanten. Zeitaufwand: O(n + m) A SZK1 SZK2 SZK1 SZK2 0 B B B B B B B B @ 11 11 1 1 1 1 1 11 11 1 0 0 C C C C C C C C A A aus DFS mit Aufwand !(n2 ) in ungerichteten Graphen (Anm.: SZK = ZK). DFS in gerichteten Graphen (Digraphen), n Knoten, m Kanten, Baum-, Vorwarts-, Ruckwarts- und Querkanten: r 1 3 ;@ @ ; 2; R5 @ ;I ; ? ; - r r r r r6 4 Bezeichnungen: - Baumkanten Ruckwartskanten Querkanten Zeitaufwand: O(n + m) Es gilt: u ist von v aus auf einem gerichteten Pfad erreichbar g.d.w. u Knoten in dem DFS-Baum (DFS-visit(v)) mit Wurzel v ist. Also: Transitive Hulle in Zeit O(n (m + n)) bzw. O(n m). Sehr gut fur dunne Graphen (also solche mit relativ wenigen Kanten). KAPITEL 4. KURZESTE PFADE 117 4.7 Ein besserer Algorithmus fur das All-pairsshortest-distance (bzw. paths)-Problem in ungewichteten Digraphen (dij )0ij<n Distanzmatrix alle Kantenlangen = 1 D Distanzmatrix fur Transitive H u lle falls dij l D(l) = (d(ijl) )oij<n mit d(ijl) = d1ij sonst algorithm 1 = p dij 1 A = (aij )0ij<n mit aij = 10 falls sonst co Sei B die Boolsche Einheitsmatrix oc for l := 2 to r + 1 do B := A B for 0 i j < n do (l) (l) if bij = 1 then dij := l else dij := 1 fi ( l ; 1) ( l ) ( l ; 1) l then dij := dij fi if dij co Sei oc od od x Dieser Algorithmus berechnet D(1) = D D(2) D(3) : : : D(r) . Sei ! eine Zahl 2, so da die Matrixmultiplikation in der Zeit O(n! ) durchgefuhrt werden kann (Winograd/Coppersmith: ! 2 376). Zeitaufwand fur Algorithmus 1: O(rn! ) algorithm apsd = p D(l) f ur l = 1 : : : r l := r l m for s := 1 to log 3 n do 2 r for i := 0 to n ; 1 do finde in der i-ten Zeile von D(l) den Wert d, 2l d l, so da d in der i-ten Zeile am wenigsten oft vorkommt Si := Menge der Spaltenindizes, in denen dieses d in der i-ten Zeile von D(l) vorkommt Berechne, mit Algorithmus 1, od l1 := 32 l for 0 i j < n do Si 6= then mij := kmin fd(l) + d(kjl) g 2Si ik (l) (l ) (l) if dij l then dij1 := dij (l ) elseif mij l1 then dij1 = mij (l ) else dij1 := 1 if fi od od x l := l1 else mij := 1 fi KAPITEL 4. KURZESTE PFADE 118 apsd berechnet: Zunachst D(1) : : : D(r), dann D(l) fur # $ # # $$ n0 l = r 32 r 32 32 r : : : |{z} n ir k 2 Si r d z }| {? z d 32 le;d l }| { rj Da fur d 2l Werte zur Auswahl stehen, gilt: jS j 2n i l Damit 0 ist die Laufzeit: B ! OB Brn + @ log 32 nr X s=1 1 n3 ( 32 )s r C C C A 3 = O rn! + nr Setze r so, da die beiden Summanden gleich sind, also r = n 3;2 ! , dann ergibt sich damit fur apsd die Laufzeit O n 3+2! . Satz: Das All-Pairs-Shortest-Distance-Problem fur Digraphen mit Kantenlange = 1 la t sich in Zeit O(n 3+2! ) losen (! Exponent fur Matrixmultiplikation). Beweis: p 3 Bemerkung: apsp: Problem: Ausgabegro e kann (n3 ) sein: n Knoten q - q - q - q q - q - q n Knoten 3 3 | {z n Knoten 3 } Kurzeste Pfade-Nachfolger-Matrix N 2 0 : : : n ; 1]nn nij = Nummer des zweiten Knoten auf "dem\ kurzesten Pfad von Knoten i zu Knoten j . So eine Matrixdarstellung fur die kurzesten Pfade zwischen allen Knotenpaaren kann in Zeit O(n 3+2! logc n) fur ein c > 0 bestimmt werden. Satz: Fur Digraphen mit Kantenlangen 2 f1 2 : : : M g M 2 N, kann APSD in Zeit O((Mn) 3+2! ) gelost werden. Idee: Ersetze ru M 0M-vr durch: u = ru0 -ur1 -ur2 r u-Mr0 = v 4.8 Ein Algorithmus fur die transitive Hulle in Digraphen mit linearer erwarteter Laufzeit Die Wahrscheinlichkeit eines Digraphen mit n Knoten und m Kanten ist (nur) eine Funktion von n und m. Daraus folgt (wir lassen der Einfachheit halber Schleifen KAPITEL 4. KURZESTE PFADE 119 (=Kanten v ! v) zu), da jede Kante (u v) mit Wahrscheinlichkeit nm2 vorhanden ist, falls wir Graphen mit n Knoten und m Kanten betrachten. Einschub: Breitensuche (BFS): Schlange, queue, FIFO: FIFO Durchlaufe Graphen, indem wir, solange moglich den vordersten Knoten v aus der Queue nehmen, ihn behandeln und die Liste seiner noch nicht behandelten Nachbarn in die queue hinten einfugen. Beispiel: 12q q q10 @ q q q q q?13@@R- q14 q q q8 4q 5 6 q? 7 1 ;@ @ I @ ; @ 2; R 3 @9 - 11 @ ;@ @ 6 ; @ @ ; R @ R @ - -? Bezeichnungen: - Baumkanten - Querkanten algorithm exp-lin-transitive-closure (C.P. Schnorr, An Algorithm for Transitive Closure with Linear Expected Time, SIAM Journal on Computing 7 (1978), pages 127-133.) Phasen: 0. Konstruiere die linear geordneten Adjazenzlisten Lri i = 1 : : : n des Graphen Gr (entsteht aus G durch Umkehrung aller Knoten). Beispiel: = 4 1 2 Lr1 = 1 2 4 = 1 4 3 Lr2 = 1 3 4 = 3 2 Lr3 = 2 3 = 1 4 2 Lr4 = 1 2 4 Ersetze ebenfalls alle Li durch Lrr i (! sortierte Adjazenzlisten) 1. Berechne fur jeden Knoten i in BFS-Art eine Liste Si von von i aus erreichbaren Knoten, so da (i) oder (ii) gilt: (i) jSi j < b n2 c + 1 und Si enthalt alle von i aus erreichbaren Knoten (ii) jSi j = b n2 c + 1 2. Entsprechende Listen Pi von Vorgangern von i 3. for i := 1 to n do Li := Si fj i 2 Pj g fj jSi j = jPj j = b n2 c + 1g L1 L2 L3 L4 od Bilde (Li )rr fur i = 1 : : : n Korrektheit: j 2 Li g.d.w. (i j ) in transitiver Hulle. Satz: Sei die Wahrscheinlichkeit eines Graphen (lediglich) eine Funktion der Anzahl n seiner Knoten und der der Anzahl m seiner Kanten. Dann ist der Erwartungswert fur die Laufzeit des Schnorr'schen Algorithmus O(n + m ), wobei m der Erwartungswert fur die Anzahl der Kanten in der transitiven Hulle ist. KAPITEL 4. KURZESTE PFADE 120 Beweis: Das Durchlaufen des Graphen (von V1 aus fur die Konstruktion von S1) in BFS-Manier liefert eine Folge (at )t1 von Knoten. Sei L( ) die -te Adjazenzliste, die in der BFS erkundet wird, L( ) = (at h( ) < t h( + 1)) Sei $L( ) die Menge der at in L( ) , und sei Si (t) := fa1 a2 : : : at g Wie bereits gezeigt, ist WS(j 2 Li ) = nm2 8i j Alle n-Tupel von geordneten Listen L1 L2 ::: Ln mit m= n X i=1 jLi j sind aufgrund der Voraussetzungen uber die Wahrscheinlichkeitsverteilung gleich wahrscheinlich. Also: Beobachtung 1: Die Mengen $L( ) = 1 2 : : : sind (paarweise) unabhangig. Beobachtung 2: Die $L( ) sind gleichverteilt, d.h. fur alle A f1 : : : ng gilt: WS($L( ) = A) = ( nm2 )jAj (1 ; nm2 )n;jAj Lemma: Sei A f1 : : : ng mit jAj = k. Sei (*at)t1 eine Folge von unabhangigen gleichverteilten Zufallsvariablen mit Wertemenge f1 : : : ng. Dann gilt: minft a*t 62 Ag hat Erwartungswert 1 + n ;k k : Beweis: WS(*a1 : : : a*r 2 A und a*r+1 62 A) = ; nk r (1 ; nk ). Also ist der Erwartungswert fur minft a*t 62 Ag: 1 X r 1 ; nk r nk r=0 r;1 X k k =1+ n 1; n r nk r1 k k = 1 + n 1 ; n ; 1 k 2 1; n 1+ k =1+ n k 1; n = 1 + n ;k k Anmerkung: 1 X r=0 d 1 = 1 rz r;1 = dz 1 ; z (1 ; z )2 3 KAPITEL 4. KURZESTE PFADE 121 Lemma: Sei 3(*at )t1 wie oben, k n2 . Dann hat minft ja*1 a*2 : : : a*tj > kg Erwartungswert 2 (k + 1). Beweis: Wegen der Additivitat des Erwartungswertes gilt: Der gesuchte Erwartungswert ist k X 1+ n; =0 k X k + 1 + n =1 2 k + 1 + k(k n+ 1) 32 (k + 1) Wenn wir jedes L( ) in sich zufallig permutieren, erhalten wir eine Folge (*at )0t3 1 von Zufallsvariablen, so da jfa1 : : : at gj = jfa01 : : : a0t gj fur t = h( ) 8 Da die a0t innerhalb eines jeden Intervalls h( ) < t h( +1) paarweise verschieden sind, gilt fur sie die vorhergehende Abschatzung erst recht. Daher sind (jS1 (t)j)t1 und (jS1 (t)0 j)t1 gleichverteilte Folgen von Zufallsvariablen, denn dies gilt zunachst fur alle Zeitpunkte der Form t = h(y) da aber fur diese Zeitpunkte S1 (t) = S10 (t) ist, und h() zufallig verteilt ist, ist auch die Verteilung der beiden Folgen zwischen diesen Intervallgrenzen identisch. Sei s der Erwartungswert und sei jSi j die tatsachliche Gro e von Si nach der Phase 1. Dann s= b nX 2 c+1 k=1 k WS(jSi j = k) Die erwartete Anzahl der Schritte (und damit die Kosten) in der BFS sei q. Dann gilt: q b nX 2 c+1 k=1 WS(jSi j = k) 32 k = 32 s: Also ist der Aufwand des Algorithmus fur die Phasen 1 und 2 im Erwartungswert 3sn. Da ns = m , und da die Kosten der anderen Phasen oensichtlich durch O(n + m + m ) beschrankt sind, folgt die Behauptung. 3 4.9 Matrizenmultiplikation a la Strassen a11 a12 b11 b12 = c11 c12 c = a b + a b ij i1 1j i2 2j a21 a22 b21 b22 c21 c22 KAPITEL 4. KURZESTE PFADE Bilde: m1 m2 m3 m4 m5 m6 m7 122 := (a12 ; a22 )(b21 + b22 ) := (a11 + a22 )(b11 + b22 ) := (a11 ; a21 )(b11 + b12 ) := (a11 + a12 )b22 := a11 (b12 ; b22 ) := a22 (b21 ; b11 ) := (a21 + a22 )b11 Dann gilt: c11 c12 c21 c22 := m1 + m2 ; m4 ; m6 := m4 + m5 := m6 + m7 := m2 ; m3 + m5 ; m7 Sei n = 2k und M(n) die Anzahl arithmetischer Operationen (Mult, Add, Sub), die Strassen's Algorithmus bei n n Matrizen benotigt: M(1) = 1 ; ; M(n) = 7M n2 + 18 n2 2 Expansion dieser Rekursionsgleichung ! M(n) = 7k+1 ; 6n2 = 7 2k log2 7 ; 6n2 = 7nlog2 7 ; 6n2 < 7n281 ; 6n2 procedure Matmult( A B n) = kill p A n< nn B und sind Matrizen oc co if 16 then berechne mit klassischer Methode gerade then elseif n spalte und in je 4 n 2 2 Matrizen auf und wende Strassen's Formeln an. F uhre die Multiplikationen rekursiv mit Matmult aus. else spalte und in je eine ( 1) ( 1) Matrix ( 11 11 ) und drei verbleibende Bl ocke auf. Wende Matmult rekursiv auf 11 , 11 an und berechne die anderen Produkte mit klassischer Methode. fi fi n A B A B AB n; n; A B A B x Satz: Der Matmult-Algorithmus hat folgende Eigenschaften: 1. Fur n < 16 ist die Anzahl der arithmetischen Operationen genauso hoch wie bei der klassischen Methode. 2. Fur n 16 ist die Anzahl der arithmetischen Operationen echt kleiner als bei der klassischen Methode. 3. Matmult braucht nie mehr als 4:8nlog2 7 arithmetische Operationen. Beweis: p 1. KAPITEL 4. KURZESTE PFADE 123 2. Sei n gerade und seien A, B zwei n n Matrizen. Wir wenden Strassen's Formeln an, fuhren aber die 7 Multiplikationen der n2 n2 Matrizen mit klassischer Methode aus. Gesamtzahl arithmetischer Operationen: 3 2 2 n n 2 7 2 2 ; 2 + 18 n2 = 74 n3 + 11 4n Dies ist besser als die klassische Methode, falls: 7 n3 + 11 n2 < 2n3 ; n2 , 15 n2 < 1 n3 , 15 < n , n 16 4 4 4 4 Sei n ungerade. Multiplizieren wir A B mit klassischer Methode, so auch A11 B11 . Also brauchen wir durch Anwendung von Strassen's Formeln auf die (n ; 1) (n ; 1) Matrizen (n ; 1 gerade) weniger Operationen, wenn n ; 1 16 ist. Durch Induktion uber die Anzahl der rekursiven Anwendungen von Strassen's Formeln folgt die Behauptung. 3. Sei M0 (n) die Anzahl arithmetischer Operationen. Dann ist: 8 < 2n3 ;; n2 falls n < 16 falls n 16 gerade M0 (n) = : 7M0 ; n2 + 184 n2 7M0 n;2 1 + 424 n2 ; 17n + 152 falls n 16 ungerade Wir denieren fur x 2 R+ : x3 ;; x 2 falls x < 32 M(x) = 27M x + 42 x2 falls x 32 2 4 Dann gilt: M(n) M0 (n) fur alle n 2 N Weiterhin ist kP ;1 h M0 (x) = 7i 42 xi i+=0, x 4 -2 k := min l , 2l < 32 ; 2 i ; ; + 7k 2 2xk 3 ; 2xk 2 fur x 32, wobei Mit k = blog2 xc ; 4 = log2 x ; t fur t 2 4 5] erhalten wir: M(x) 7log2 x t 13 47 t ! + 2 87 Fur x < 32 direkt nachrechnen. 4 8 7log2 x fur x 32. 3 Kapitel 5 Matchings in Graphen 5.1 Grundlagen Denition: Sei G = (V E ) ein ungerichteter, schlichter Graph. Ein Matching M in G ist eine Teilmenge von E , so da keine zwei Kanten aus M einen Endpunkt gemeinsam haben. r r r r @ @ @ r r Matching: Variante 1 Variante 2 Denition: 1. Ein Matching M in G = (V E ) hei t perfekt (oder vollkommen), falls jM j = jV2 j 2. Ein Matching M hei t "Matching maximaler Kardinalitat\ (engl. maximum matching) in G, falls es in G kein Matching M 0 mit jM 0 j > jM j gibt. (! durchgehend geringelt (rot) im Beispiel) 3. Ein Matching M hei t maximal in G, falls es bezuglich "\ maximal ist. (engl. maximal matching, ! gepunktet geringelt (grun) im Beispiel) Denition: 1. Ein einfacher Pfad (Kreis) v0 v1 : : : vr hei t alternierend bzgl. eines Matchings M , falls die Kanten fvi vi+1 g, 0 i < r, abwechselnd in M und nicht in M liegen. 124 KAPITEL 5. MATCHINGS IN GRAPHEN vr0 vr1 vr2 vr3 125 vr4 gerade Lange vr0 vr1 vr3 vr2 2. Ein alternierender Pfad hei t augmentierend, falls er bzgl. "\ maximal ist und an beiden Enden ungematchte Kanten hat. A ? vr0 vr1 vr2 vr3 ungerade Lange vr4 rv5 ? Bemerkung: Es kann keine augmentierenden Kreise geben. Denition: Sei G = (V E ) ein Graph. Wenn V in zwei nichtleere Teilmengen V1 und V2 partitioniert werden kann (V1 V2 = V , V1 \ V2 = ), so da E V1 V2 ist, so hei t G bipartit (G = (V1 V2 E )). Heiratssatz: (Frobenius, Hall, Rado, Konig) Sei G = (V1 V2 E ) ein bipartiter Graph. G enthalt ein Matching der Kardinalitat jV1 j genau dann, wenn gilt: 8V V1 : jN (V )j jV j wobei N(V ) die Nachbarschaft von V (in V2 ) bezeichnet. rPP r rPPPP;PP;;Pr rPP;PPPr r PVr2 ; V1 Satz: Ein Graph G = (V E ) hat ein perfektes Matching genau dann, wenn jV j gerade ist und es kein S V gibt, so da der durch V n S induzierte Teilgraph mehr als jS j Zusammenhangskomponenten ungerader Gro e enthalt. r r r r r r Satz:(Berge, 1957) r '$ r r &% r r S r r Ein Matching hat maximale Kardinalitat genau dann, wenn es keinen augmentierenden Pfad dafur gibt. KAPITEL 5. MATCHINGS IN GRAPHEN 126 Denition: Seien S , T zwei Mengen, dann bezeichne S # T die symmetrische Dierenz von S und T , d.h. S # T = (S ; T ) (T ; S ). Lemma: Sei M ein Matching, P ein augmentierender Pfad bzgl. M . Dann ist auch M # P ein Matching und es gilt jM # P j = jM j + 1. Beweis: "(\ q q q q q q q q q Pq ")\ Satz von Berge M #P M 3 Lemma: Seien M , N Matchings in G, und sei jN j > jM j. Dann enthalt N # M mindestens jN j ; jM j knotendisjunkte augmentierende Pfade bzgl. M . Beweis: Der Grad eines Knotens in (V N # M ) ist 2. Die Zusammenhangskomponenten von (V N # M ) sind also 1. isolierte Knoten 2. einfache Kreise (gerade Lange) 3. alternierende Pfade Seien C1 : : : Cr die Zusammenhangskomponenten in (V N # M ) dann gilt: M # C| 1 # C2 {z # : : : # C}r = N N M Nur die Ci 's die augmentierende Pfade bzgl. M sind, vergro ern die Kardinalitat des Matchings und zwar jeweils um genau 1. Also mu es mindestens jN j;jM j Ci 's geben, die augmentierende Pfade bzgl. M sind (ev. knotendisjunkt da ZHK's). 3 Korollar: Satz von Berge Lemma: Sei M ein Matching der Kardinalitat r, und sei s die maximale Kardinalitat eines Matchings in G = (V E ). Dann gibt es einen augmentierenden Pfad bzgl. M der Lange 2b s;r r c + 1, wobei s > r vorausgesetzt sei. Beweis: Sei N ein Matching maximaler Kardinalitat in G, jN j = s. N # M enthalt s ; r augmentierende Pfade bzgl. M , die alle knotendisjunkt und damit auch kantendisjunkt sind. Einer dieser augmentierenden Pfade enthalt daher b s;r r c Kanten aus M . 3 Lemma: Sei P ein kurzester augmentierender Pfad bzgl. M und sei P 0 ein augmentierender Pfad bzgl. des neuen Matchings M # P . Dann gilt: jP 0 j jP j + 2jP \ P 0 j KAPITEL 5. MATCHINGS IN GRAPHEN 127 Beweis: N = M # P # P 0, also N = jM j + 2. Also enthalt M # N mindestens 2 knotendisjunkte augmentierende Pfade bzgl. M , etwa P1 P2 . Es gilt: N # M = P # P 0 , also jP # P 0 j Def. = j(P ; P 0 ) (P 0 ; P )j = jP j + jP 0 j ; 2jP \ P 0 j jP1 j + jP2 j 2jP j, also jP j + jP 0 j ; 2jP \ P 0 j 2jP j also jP 0 j 2| jP j{z; jP}j +2jP \ P 0 j 3 jP j Schema fur Matching Algorithmus: 1. Beginne mit Matching M0 := . 2. Berechne Folge M0 P0 M1 P1 : : : Mi Pi : : : Wobei jeweils Pi ein kurzester augmentierender Pfad bzgl. Mi ist und Mi+1 = Mi # Pi . Es gilt: jPi+1 j jPi j Lemma: Seien Pi und Pj in obiger Folge zwei augmentierende Pfade gleicher Lange. Dann sind Pi und Pj knotendisjunkt. Beweis: Annahme: es gibt eine Folge (Pk )k0 mit jPi j = jPj j, j > i, Pi \ Pj 6= 0, j ; i minimal gewahlt. Durch die Wahl von j sind die Pfade Pi+1 : : : Pj knotendisjunkt. Also ist Pj ein augmentierender Pfad bzgl. M 0 , dem Matching nach dem augmentieren mit P0 P1 : : : Pi . Mit vorigem Lemma: jPj j jPi j + 2jPi \ Pj j also Pi Pj kantendisjunkt. Da in M 0 jeder Knoten in Pi gematcht ist (und auch in M 0 # Pi+1 # Pi+2 # : : : # Pj;1 ) konnen Pi und Pj auch keinen Knoten gemeinsam 3 haben. Satz: Sei s die maximale Kardinalitat eines p Matchings in G = (V E ). Dann enthalt die Folge jP0 j jP1 j : : : hochstens b2 s + 1c verschiedene Werte. Beweis: Sei r := bs ; psc. Per Konstruktion ist jMij = i, also jMr j = r. Mit dem Lemma uber die maximale Lange eines kurzesten augmentierenden Pfades folgt psc b s ; s jPr j 2 s ; bs ; psc + 1 2 ps + 1 = 2bpsc + 1: p F ur i r ist also jPi j eine der ungeraden Zahlen in 1 2 s + 1], alsop eine von p b sc +1 ungeraden Zahlen. Pr+1 : : : {s;1 tragen hochstens s ; r ; 1 < s zusatz 3 liche Langen bei. Verfeinertes Schema: M := while 9 augmentierender Pfad bzgl. M do l := L ange des k urzesten augmentierenden Pfades bzgl. M bestimme eine bzgl. \ maximale Menge fQ1 : : : Qm g " augmentierender Pfade bzgl. M , die alle L ange l haben und M := M # Q1 # : : : # Qm knotendisjunkt sind od Korollar: In obiger while-Schleife nden hochstens O jV j 12 Durchlaufe statt. KAPITEL 5. MATCHINGS IN GRAPHEN 128 5.2 Matchings maximaler Kardinalitat in bipartiten Graphen Gegeben: G = (V1 V2 E ) bipartiter Graph. Simultane BFS zur Bestimmung der Lange eines kurzesten augmentierten Pfades. p v 2 V1 V2 labelv] := 0 for alle od do rHH r rHHHHHr r HHHHr rXXXX Hr XXr r R := l := 1 v 2 V1 do fv wg 2 E do labelw] := 1 R := R fwg for alle freien Knoten for alle Kanten od od while R 6= and R enth alt keinen L := l++ for alle w 2 R fv wg 2 M do L := L fvg labelv] := l freien Knoten do V1 L od R := l++ for alle v 2 L fv wg 2 E n M if labelw] = 0 then R := R fwg labelw] := l do fi od od R := x Menge der freien Knoten in R V1 Kopie der Knoten von V2 rHH r HH rHH HHr H H rH@H HHr @H H @ r @HHr @ r @r V1 frei V2 V1 V2 r r r r rQm r r r freie Q Knoten Q Q r Qr r@A r ;in R R A@; r r r AA@rm; L r r r AAr V2 R