7 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) 7 72 Gierige Algorithmen (Greedy Algorithms) In diesem und den folgenden Kapiteln werden einige Prinzipien zur Aufgabenlosung herausgearbeitet, die vielen Algorithmen zu Grunde liegen. Wir besprechen jeweils eine Algorithmenklasse in einem Kapitel. Zunachst betrachten wir sogenannte gierige Algorithmen zur schrittweisen Berechnung optimaler Elemente aus einer bestimmten Grundmenge. Prinzip. • Optimiere in jedem Schritt lokal. • Bei g unstiger Aufgabenstruktur entsteht so ein globales Optimum. • Aber das ist eher die Ausnahme: Wer beim Wandern im Gebirge immer nur aufwarts geht, erreicht nicht unbedingt den hochsten Gipfel. 7.1 Minimale Spannbäume Aufgabe: • Gegeben: endlicher, kantenmarkierter zusammenhangender Graph. • Gesucht: minimaler Spannbaum (MSB, minimum spanning tree, MST), d.h. ein Spannbaum mit minimalem Gesamtgewicht. • Wegen der Endlichkeit des Graphen existiert stets eine L osung. Anwendungsbeispiel: Aufbau kosteng unstiger Netzwerke zwischen gegebenen Knoten. Dabei sind Kantenge- wichte z.B. Leitungskosten, Entfernungen. 7.1.1 Charakterisierung von Bäumen Zur Vorbereitung der Algorithmen brauchen wir einige Eigenschaften von Baumen. Lemma 7.1.1 Sei T = (V, E) ein Baum. (1) Fur alle v, w ∈ V existiert genau ein Weg von v nach w in T . (2) Fur alle v, w ∈ V gilt: Ist vw ∈/ E, so hat T ∪ {vw} genau einen Kreis; dieser enthalt vw. (3) Sei u ∈ V mit |N(u)| = k. Dann zerfallt der Baum durch Entfernen von u in k Komponenten. (4) m = n − 1. Beweis: (1) Da T zusammenhangend ist, gibt es einen Weg von v nach w. • Annahme: P1 , P2 seien verschiedene Wege von v nach w. • Dann gibt es eine erste Kante v 0 w 0 auf P2 , die nicht zu P1 geh ort: P1 0 7w v • EEE*j *j *j *j *j *j *j 7w 7w EE w 7 j* *j j* EE w7 w7 *j j* j* 7 w E w7 j* o / / o o / o/ o/ /o o/ • w 0 v• w • P2 • Da P2 Weg ist, gilt v 0 6= w 0 und v 0 6= w. 7 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) 73 1. Fall: Es ist auch w 0 6= w. • Dann ist aber v 0 · · · w · · · w 0 v 0 ein Kreis. • Widerspruch zur Baumeigenschaft! 2. Fall: Es gilt w 0 = w. • Dann enthalt das Restst uck v 0 · · · w mindestens einen weiteren Punkt, denn die Kante v 0 w ist ja schon in P2 \verbraucht". • Damit haben wir den Kantenzug v 0 · · · wv 0 , der einen Kreis enthalten muss, also wieder einen Widerspruch zur Baumeigenschaft! (2) Der nach (1) eindeutige Weg von v nach w bildet mit vw einen Kreis K, der vw enthalt. • Annahme: T ∪ {vw} hatte einen weiteren Kreis K 0 . • Dieser muss aber auch vw enthalten, da T kreislos ist. • Andererseits muss er v und w in T verbinden; diese Verbindung ist aber nach der ersten Aussage eindeutig, stimmt also mit dem Stuck von K ohne vw uberein. • Damit sind K und K 0 identisch. (3) Der Ausgangsgraph sei G. • Betrachte zwei beliebige Nachbarn v 6= w von u. • Der um u und die von ihm ausgehenden Kanten verminderte Graph sei G 0 . • Nach 1. gibt es in G genau einen Weg von v nach w. Dies muss dann vuw sein. • Dieser Weg wird durch Entfernen von u zerst ort. • Also liegen v und w in verschiedenen Komponenten von G 0 . • Also hat G 0 mindestens k Komponenten. Es sei nun x 6= u ein beliebiger Knoten von G. • Wieder nach 1. gibt es in G genau einen Weg von x nach u. • Dieser f uhrt uber einen Nachbarn v von u (v = x ist moglich) und enthalt u nicht. • Das Wegst uck von x nach v bleibt in G 0 erhalten; also liegt x in der Komponente von v. • Damit gibt es auch nicht mehr als k Komponenten. (4) Wir fuhren eine Induktion nach n. • Der Induktionsanfang n = 1 ist klar. • Sei also nun n > 1. Wir entfernen einen beliebigen Knoten u. def • Sei k = |N(u)|. Die nach 3. entstehenden k Komponenten sind wieder Baume, erf ullen nach Induktionsvoraussetzung also mi = ni − 1. Es folgt m = k+ = k+ = k+ k X i=1 k X i=1 k X i=1 = k X i=1 ni mi (ni − 1) ni − k 7 74 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) = n−1 , da u ja entfernt wurde. t u Hieraus erhalten wir nun Lemma 7.1.2 (Charakterisierung von Bäumen) F ur einen Graphen G mit n ≥ 1 Knoten sind folgende Aussagen aquivalent. (1) G ist Baum. (2) G ist zusammenhangend mit m = n − 1 Kanten. (3) G ist kreislos und m = n − 1. Beweis: Die Aussagen (1) ⇒ (2) und (1) ⇒ (3) wurden in den vorigen Lemmata gezeigt. (2) ⇒ (1): • Annahme: G ist kein Baum, d.h. G enthalt einen Kreis. • Betrachte einen Spannbaum B = (V, E 0 ) f ur G. • Da G einen Kreis enthalt, muss E 0 ⊂ E, also |E 0 | < |E| gelten. • Wegen (1) ⇒ (2) folgt aber |E 0 | = n − 1 = |E|. Widerspruch! (3) ⇒ (1): • Nach Voraussetzung ist G ein Wald. Sei k die Anzahl der Komponenten. • Jede Komponente ist selbst Baum mit mi = ni − 1. Aufsummieren ergibt m= k X i=1 mi = k X (ni − 1) = i=1 k X ni − k = n − k . i=1 • Wegen m = n − 1 ist k = 1, also G zusammenhangend. t u Aus Lemma 7.1.2 sind zwei Ideen zur Erzeugung von Spannbaumen ableitbar: • Beginne mit trivial zusammenhangende Teilgraphen (ein Punkt), vergr oere schrittweise bis m = n − 1 erreicht ist (Prim). • Beginne mit trivial kreislosen Teilgraphen, vergr oere schrittweise unter Beibehaltung der Kreislosigkeit bis m = n − 1 erreicht ist (Kruskal). 7.1.2 Lösung nach Prim Wahle s ∈ V beliebig, setze T0 = ({s}, ∅). • Erganze Tk zu Tk+1 um eine billigste Kante vw mit v ∈ Tk und w ∈ / Tk (gierig!). • Tn−1 ist eine L osung der Aufgabe. Beispiel 7.1.3 Betrachte folgenden Ausgangsgraphen und wahle als s den Knoten links oben. • • 7 • 3 • • 2 Prims Algorithmus liefert den MSB • 2 • 4 • 58 4 • 6 2 1 6 • 2 1 • • t u 7 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) 75 Korrektheit. Die Tk sind Baume mit k + 1 Knoten und k Kanten. Damit ist Tn−1 Spannbaum. Auerdem zeigen wir, ahnlich wie in der Invariantentechnik, ∀ k : ∃ MSB M : Tk ⊆ M . Beweis: Induktion u ber k. • k = 0 : klar. k → k+1: • Sei Tk ⊆ M, wobei M MSB, und Tk+1 = Tk ∪ {e}. • Ist e in M, so sind wir fertig. • Andernfalls hat M ∪ {e} genau einen Kreis K mit e in K nach Lemma 7.1.1. • e verbindet einen Punkt von Tk mit einem Punkt auerhalb von Tk . • Da K durch e lauft, muss es eine weitere Kante v 0 w 0 in K geben, die ebenfalls aus Tk herausf uhrt. • Setze def M 0 = M\{v 0 w 0 } ∪ {e} . • Der einzige Kreis in M ∪ {e} ist in M 0 wieder unterbrochen. • Andererseits enthalt M 0 wie M alle Knoten und ist nach Konstruktion auch zusammenhangend, also Spannbaum. • Das Gesamtgewicht g(M 0 ) errechnet sich zu g(M 0 ) = g(M) − g(v 0 w 0 ) + g(e). • Nach Wahl von e gilt aber g(e) ≤ g(v 0 w 0 ), da e eine billigste, aus Tk herausf uhrende Kante ist. • Also folgt g(M 0 ) ≤ g(M); da M MSB, ist g(M) ≤ g(M 0 ), d.h. g(M) = g(M 0 ), d.h. M 0 ist ebenfalls MSB. t u Implementierung: Als Variante des Dijkstra-Algorithmus, wobei • dd[v] das Gewicht einer billigsten Kante von v in die Menge OK ist und • OK jeweils die Knoten von Tk enthalt. waehle s in V beliebig ; for all (v != s) { dd[v] = g(sv) ; pre[v] = s ; } dd[s] = 0 ; OK = single(s) ; while (!OK.equals(V)) { finde w mit !(OK.contains(w)) und dd[w] minimal ; OK = OK.union(w) ; for all (v mit !(OK.contains(v))) if (dd[v] > g(wv)) { dd[v] = g(wv) ; pre[v] = w ; } } // // // // // Zeile 0 Zeile 1 g im erw. Graphen Zeile 2 Zeile 3 // Zeile 4 // Zeile 5 // Zeile 6 Im Vergleich zu Dijkstra hat sich nur Zeile 6 geandert. Uber pre k onnen die Kanten des Spannbaumes rekonstruiert werden. Aufwand: wie bei Dijkstra in O(n2 ) oder O(m · log n). 7 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) 7.1.3 76 Lösung nach Kruskal • Setze T0 = (V, ∅). • Erganze Tk zu Tk+1 um eine billigste Kante, die keinen Kreis erzeugt (gierig!). • Dann ist Tn−1 eine L osung. Korrektheit. Zur Invarianten: Die Tk sind kreislos mit k Kanten und es gilt ∀ k : ∃ MSB M : Tk ⊆ M. Beweis: • k = 0 (vor Schleifenantritt): klar. • k → k + 1: Sei Tk ⊆ M f ur einen MSB M. • Tk+1 hat k + 1 Kanten und ist kreislos. • Sei Tk+1 = Tk ∪ {e}. Ist e in M, so sind wir fertig. • Sonst hat M ∪ {e} genau einen Kreis K, der e enthalt. • Die Kante e verbindet zwei Komponenten von Tk (andernfalls hatte Tk+1 einen Kreis in einem seiner Teilgraphen). • Auerdem kann K\{e} nicht ganz in Tk liegen, da e so gewahlt wurde, dass Tk ∪ {e} kreislos bleibt. • Also muss es in K eine weitere Kante vw geben, die zwei Komponenten von Tk verbindet. • Setze M 0 = M\{vw} ∪ {e}. • Der einzige Kreis K von M ∪ {e} ist in M 0 unterbrochen. • Aber M 0 ist zusammenhangend und enthalt alle Knoten, ist also Spannbaum. • Weiter gilt g(M 0 ) = g(M) − g(vw) + g(e) ≤ g(M) , da nach Wahl g(e) ≤ g(vw). • Es folgt g(M) = g(M 0 ), d.h. auch M 0 ist MSB, der Tk+1 umfasst. t u Es fallt auf, dass der Beweis sehr ahnlich zu dem bei Prims Algorithmus verlauft. Tatsachlich gibt es eine geeignete Abstraktion: Die mathematischen Strukturen der sogenannten Matroide und Greedoide erlauben einen schematischen Korrektheitsbeweis fur alle Greedy-Algorithmen ein fur alle Mal. Wir gehen hierauf aber nicht genauer ein. 7.1.4 Implementierung Zentraler Schritt ist das Finden von Kanten mit minimalem Gewicht. Dies kann auf zwei Arten beschleunigt werden: • Sortieren in O(m · log m). • Halte Kanten in Min-Halde: { Aufbau der Halde in O(m); { Prufung aller m Kanten benotigt m-Mal deletemin, zusammen O(m · log m). In der Praxis muss man aber oft viele der teuren Kanten gar nicht betrachten. Daher ist das Verfahren praktisch schnell, insbesondere mit folgender Verfeinerung: • Zur Pr ufung, ob eine neue Kante einen Kreis erzeugt, nutzt man aus, dass die Tk jeweils Walder, d.h. Mengen von Komponenten, d.h. von Aquivalenzklassen sind. 7 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) 77 • Hinzunahme von vw erzeugt genau dann einen Kreis, wenn v, w bereits in derselben Klasse liegen (Lemma 7.1.1), andernfalls werden durch Hinzunahme von v, w zwei Komponenten verbunden, d.h. zwei Klassen zusammengelegt. • Man verwaltet also die Klassen in einer union-find-Struktur. • Nach Abschnitt 5.3 liegt der Aufwand hierf ur in O(m · α(m, n)). • Damit bleibt der Gesamtaufwand in O(m · log n). Satz 7.1.4 Ein MSB lasst sich in O(n2 ) oder O(m · log n) bestimmen. Beispiel 7.1.5 Man betrachte nochmals Beispiel 7.1.3. Kruskals Algorithmus liefert hier das selbe Ergebnis wie Prims Algorithmus. Im allgemeinen wird aber ein anderes Ergebnis entstehen. t u 7.2 Ein einfaches Planungsverfahren (scheduling) Gegeben: n Aufgaben, die mit Laufzeiten t1 , . . . , tn zu bearbeiten sind. Gesucht: Bearbeitungsreihenfolge, so dass die durchschnittliche Beendigungszeit minimal wird. Beispiel 7.2.1 Seien t1 = 15, t2 = 8, t3 = 3 und t4 = 10. Bei Reihenfolge 1234 ist die durchschnittliche Beendigungszeit 1 · (15 + (15 + 8) + (23 + 3) + (26 + 10)) = 25 4 t u Im allgemeinen ist die durchschnittliche Beendigungszeit bei Reihenfolge i1 , . . . , in T = = 1 n 1 n n X l−1 X · ( tij ) + til · l=1 n X j=1 (n − k + 1) · tik k=1 = 1 n n n X X · (n + 1) · tik − k · tik k=1 |k=1 {z } (∗) T wird minimal, wenn (∗) maximal ist. Dies ist wegen der Gewichtung mit k dann der Fall, wenn die Laufzeiten mit wachsendem k wachsen, also i1 , . . . , in aufsteigend nach zugeh origen Laufzeiten sortiert sind. Also Losung: Wahle Aufgabe i1 mit kurzester Laufzeit (gierig! ), ordne dann die restlichen Aufgaben an (\shortest job next" ). 7.3 7.3.1 Huffman-Codes Grundbegriffe Umfeld: Binare Codierung eines Zeichensatzes A, d.h. c : A → {0, 1}∗ . Die Codierung c erfullt die Fano-Bedingung, wenn fur alle a, b ∈ A mit a 6= b gilt, dass c(a) kein Prax von 7 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) 78 c(b) ist. Prinzip der Baumdarstellung für Binärcodes: • Verzweige an der Wurzel nach erstem Codezeichen, dann rekursiv mit dem Rest im entsprechenden Un- terbaum. • Ist ein Codewort zu Ende, schreibe sein Urbild an den erreichten Knoten. Beispiel 7.3.1 Betrachte die Codierung a 7−→ 000 7 → 001 b− c: d 7−→ 01 f 7−→ 10 k 7−→ 11 Der zugehorige Codebaum ist 0 p•II 1 ppp II•2 9 p 9 • 0 9 1 0 2 1 /•/ d f k 0 /1 a b Dabei ist c−1 (001011011) = c−1 (001|01|10|11) = bdfk . t u Ein Code erfullt also die Fano-Bedingung genau dann, wenn im Codebaum nur Blatter beschriftet sind. • Sie ist trivial erf ullt, wenn alle Codeworter gleichlang sind und c injektiv ist. • Oft ist es aber g unstiger, die Codelange abhangig von der Zeichenhaugkeit zu wahlen (je hauger, desto kurzer). • Daher lautet die Aufgabe: Suche bei gegebener Zeichenhaugkeit einen Code mit Fano-Bedingung, f ur den Texte mit dieser Zeichenhaugkeit kurzestmoglich codiert werden. • F ur den zugehorigen Codebaum schreiben wir kurz OCB statt \optimaler Codebaum fur den betrachteten Text". Eine Anwendung dieser Aufgabe ist Datenkompression. Sind keine einheitlichen Dateien gegeben, so muss jeweils der Code selbst mit abgespeichert werden { was nur fur groe Dateien sinnvoll ist. Bemerkung 7.3.2 Andere Methoden codieren nicht Einzelzeichen, sondern kurze Zeichenfolgen: In nat urlichsprachigen Texten ist etwa \qu" viel hauger als \qx"! Beispiel 7.3.3 Ein Text enthalte nur a, e, n, s, t, t, ←-. Folgende Haugkeiten seien angenommen: a e n s t t ←10 15 12 3 4 10 1 Die Codelange sei konstant drei Bits, etwa iUU i0iii • UU1UUUUN i i i L 0 rr• NN1 0 tt• LL1 LL2 NN r t •t22t •2 • •r44r 0 2 1 0 4 1 0 2 1 0 a e n s t t ←←- k onnte unter Erhalt der Fano-Bedingung auch mit 11 codiert werden; das spart Θ(Zeilenzahl) Bits. t u Beobachtungen: (1) Hat ein Knoten im Codebaum nur einen Sohn, so kann dieser weggelassen und das zugehorige Codewort verkurzt werden; dabei entsteht ein gunstigerer Code; die Fano-Bedingung bleibt erhalten. 7 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) 79 (2) Vertauschen von Blattern gleicher Tiefe erhalt die Gesamtcodelange fur den betreenden Text. Wegen (1) deniert man Definition 7.3.4 Ein Binarbaum heit luckenlos, wenn jeder innere Knoten genau zwei Sohne hat. Optimale Codebaume sind also luckenlos. Die entscheidende Idee fur die gestellte Aufgabe ist: Hange seltene Zeichen moglichst weit unten in den Baum, hauge moglichst weit oben. Dann haben hauge Zeichen kurze Codes, seltene Zeichen langere Codes. 7.3.2 Konstruktion des gewünschten Codes Fasse schrittweise Zeichen zu Sohnen hoherer Knoten zusammen: • Beginne mit einem Wald aus lauter Einzelknoten und • fasse jeweils zwei Baume zu einem gr oeren zusammen. • Zahle bereits entstandene Baume wie Einzelzeichen, deren Haugkeit die Summe der Haugkeiten ihrer Blatter ist. • Fasse jeweils die seltensten Zeichen zusammen. Beispiel 7.3.5 Wir betrachten nochmals die Codierung c aus Beispiel 7.3.1. • Zunachst werden die beiden seltensten Zeichen s und ←- zu einem Baum zusammengefasst und als ein Zeichen der Haugkeit 4 gezahlt: 0 s •;; ; 1 ←- • Jetzt sind t und der eben entstandene Baum die seltensten Zeichen und werden auf gleiche Weise zusam- mengefasst. Dies ergibt •>>>1 5 •5 t 0 5 1 s ←0 mit Haugkeit 4 + 4 = 8. • Analog erhalt man mit Haugkeit 18 •::: 1 0 ~~ ~ ~ : • : a 0 : 1 •55 t 0 5 1 s ←- • Die beiden seltensten Zeichen sind nun n und t. Also werden sie zu einem Zeichen mit Haugkeit 22 zusammengefasst. • Jetzt hat man noch 3 Zeichen: e, den n-t-Baum und den obigen Baum. • Fahre nach dem Schema fort bis sich schlielich als ein moglicher optimaler Codebaum folgendes ergibt: 0 qq•LLL1 LL5 q q : q 0 •:: 1 0 •5 1 •5 e n t 0 55 1 •:: a 0 : 1 •55 t 0 5 1 s ←- t u Huffmans Algorithmus: Fasse die Zeichen a1 , . . . , an als Wald {T1 , . . . , Tn } auf und bezeichne mit f(Ti ) die Haugkeit von ai im gegebenen Text. W = Forest(T1,...,Tn) ; 7 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) 80 for (k = 1 ; k <= n ; k++) { waehle in W Baeume S und U mit minimalen f-Werten ; fuege S und U zu einem neuen Binaerbaum T zusammen, mit einer neuen Wurzel, und setze f(T) = f(S)+f(U) ; W = W.minus(S,U).union(T) ; } Am Ende der Schleife ist W einelementig; liefere das einzige Element als optimalen Codebaum ab. 7.3.3 Korrektheit Die Terminierung ist wegen der Endlichkeit klar. Zur grigen Formulierung der Invarianten benotigen wir noch einige Hilfsbegrie, die Zerlegungen von Baumen beschreiben. • Gegeben seien ein l uckenloser Binarbaum B, dessen Blatter von links nach rechts mit einer Permutation von 1, . . . , n beschriftet sind, sowie ein Wald W = {T1 , . . . , Tn } von Codebaumen. • Dann bezeichnen wir mit B ◦ W den Baum, der entsteht, indem in B jeweils das Blatt mit Beschriftung i durch den Baum Ti ∈ W ersetzt wird. • Man kann sich B wie ein Inhaltsverzeichnis, die Ti wie die zugeh origen Kapitel vorstellen; dann ist B ◦ W das fertig zusammenmontierte Buch. • Gilt umgekehrt T = B ◦ W f ur einen Baum T , so stellt das Paar (B, W) eine Zerlegung von T dar. • Wir nennen nun einen Wald W Teilwald eines Baums T , in Zeichen W v T , wenn es einen l uckenlosen Binarbaum B gibt, so dass (B, W) Zerlegung von T ist. • Dies bedeutet, dass alle Baume von W in T auftreten, und zwar so, dass zum einen ihre Blatter mit Blattern von T zusammenfallen und zum anderen ihre Vorkommen in T sich nicht uberlappen. Damit wahlen wir nun folgende Invariante I fur Humans Algorithmus: ∃ OCB T : W v T . Man beachte die formale Ahnlichkeit zu den Invarianten fur die Algorithmen von Prim und Kruskal. Initialisierung: I gilt vor der for-Schleife, denn man wahle als T einen beliebigen OCB, der wegen der Endlichkeit der Aufgabe existiert. Invarianz: • Es gelte I mit OCB T und Zerlegung (B, W) von T . • Seien S = Ti und U = Tj mit minimalen f-Werten aus W gewahlt. • Wir zeigen zunachst, dass T so zu T 0 umgebaut werden kann, dass die Wurzeln von Ti und Tj in T 0 Br uder 0 maximaler Tiefe sind und I mit T statt T gilt. • Im folgenden sei jeweils dl die Tiefe des Blattes l in B. Fall 1: di und dj sind bereits maximal (also insbesondere gleich). • Dann k onnen wir nach obiger Beobachtung (2) wegen der Luckenlosigkeit von B die Blatter i und j zu Brudern machen. def • Der entstehende Baum sei B 0 . Dann ist auch T 0 = B 0 ◦ W ein OCB, so dass I mit T 0 statt T gilt. Fall 2: Sei etwa di nicht maximal in B. • Dann gibt es ein Blatt l maximaler Tiefe dl mit di < dl . B 00 entstehe aus B durch Vertauschen von l mit i. 7 81 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) • In B 00 ◦ W sind die Codes der f(Ti )-mal im Text auftretenden Zeichen von Ti jeweils um dl − di Bits langer, wahrend die Codes der Zeichen in Tl je dl − di kurzer sind. • Bei diesem Ubergang andert sich also die Gesamtlange des Codes fur den Text um f(Ti ) · (dl − di ) − f(Tl ) · (dl − di ) = [f(Ti ) − f(Tl )] · (dl − di ) ≤ 0 . (Der erste Faktor ist ≤ 0, da Ti f-minimal gewahlt ist, der zweite > 0 nach Wahl von l.) • Also ist die Gesamtcodelange auch unter B 00 ◦ W nicht vergr oert. • Da sie unter T schon minimal war, ist sie wieder minimal. • Also ist B 00 ◦ W wieder ein OCB (da B 00 nach Konstruktion auch l uckenlos ist), und i hat in B 00 maximale Tiefe. • Nun ist ggf. die Konstruktion f ur j zu wiederholen. Schlielich liegt Fall 1 vor, so dass dann B 0 und damit 0 T konstruiert werden k onnen. • Nun sei > ^ def W = W\{Ti , Tj } ∪ 0 Ti •>> 1 Tj . ^ aus B 0 durch Streichen der Blatter i und j und geeignetes Umnumerieren. • Weiter entstehe B ^ W) ^ eine neue Zerlegung von T 0 , deren Teilwald W ^ gerade den Wert der Variablen W nach dem • Dann ist (B, Schleifendurchgang beschreibt. • Also gilt dann wieder I mit T 0 statt T . Schlussbetrachtung: • Beim k-ten Schleifendurchgang gilt |W| = n − k + 1. • Bei Schleifenterminierung ist k = n, also |W| = 1. • Damit hat das nach I existierende B genau ein Blatt, besteht also wegen der L uckenlosigkeit nur aus diesem Blatt. • Ersetzen dieses Blattes durch T1 ergibt einen OCB, d.h. W besteht dann aus genau einem OCB. 7.3.4 t u Implementierung Man halt die Baume in einer Min-Halde der Groe ≤ n. • Aufwand: einmal buildheap, n − 2 insert-Operationen f ur die neu erzeugten Baume und 2(n − 1) deletemins, also insgesamt O(n · log n). • Ist die zu codierende Datei sehr lang/gro im Vergleich zu n, so kann man auch eine sortierte Liste statt der Halde verwenden (Aufwand: O(n2 )), • denn dann ist der Aufwand f ur die Codeberechnung im Vergleich zur eigentlichen Codierung verschwindend gering. 7.4 7.4.1 Eine Packaufgabe (Bin Packing) Aufgabenstellung • Zur Verf ugung stehen Behalter (beliebig viele) gleicher Groe. • In diese sollen n Objekte der Gr oen s1 , . . . , sn mit si > 0 bei minimaler Behalterzahl gepackt werden. • Dabei gelte die Normierung, dass die Behaltergr oe 1 ist und die Objektgroen im Intervall ]0, 1] liegen. 7 82 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) Beispiel 7.4.1 Die Objektgr oen seien 0.2, 0.3, 0.7, 0.3, 0.3, 0.8 und 0.4. Dann ist z.B. Moglichkeit 1 0.3 0.3 0.3 oder Moglichkeit 2 0.2 0.7 0.3 0.3 0.4 0.4 0.3 0.7 0.8 0.2 0.8 welche auch optimal ist. t u Es ist bisher kein ezienter Algorithmus bekannt, der die Aufgabe in Allgemeinheit lost. Mit gierigen Methoden erhalt man aber Algorithmen, die nicht zu weit vom Optimum abweichen. Zwei Varianten dieser Aufgabe sind • • O-line: Die Objekte sind von Beginn an samtlich bekannt. On-line: Die Objekte werden nach und nach geliefert, aber jedes muss in konstanter Zeit, d.h. innerhalb eines begrenzten Zeitraumes verpackt werden. Im folgenden sagen wir statt \Behalter" kurzer \Kasten"; die optimale Kastenzahl wird oft mit OPT bezeichnet. 7.4.2 On-line-Verfahren Wir betrachten \extreme" Eingabefolgen, die zur Abschatzung der Abweichung vom Optimum dienen. • Wesentlich: Ein on-line-Verfahren darf zu jedem Zeitpunkt nur von dem bis dahin gesehenen Anfangsst uck der Eingabefolge abhangen. • Betrachte m ∈ IN gerade, 0 < ε < 0.1 und die zwei Eingabefolgen I1 : m Objekte der Gr oe 21 − ε I2 : I1 gefolgt von m Objekten der Gr oe • F ur I1 sind m 2 1 2 +ε Kasten optimal, fur I2 hingegen m (je ein groes und kleines Objekt in einem Kasten). • Ein Verfahren, das f ur I2 optimal ist, muss also fur jedes kleinere Objekt einen neuen Kasten verwenden, erledigt aber dann I1 gerade schlechtestmoglich! Satz 7.4.2 F ur jedes on-line-Verfahren A zu dieser Aufgabe gibt es Eingabefolgen, die mindestens 4/3 der jeweils optimalen Kastenzahl brauchen. Beweis: Annahme (∗): A garantiert < 43 OPT. • A ben otige fur I1 k Kasten. Also gilt k < 4 3 · m 2 = 23 m. • F ur I2 fullt A diese Kasten mit hochstens 2k Objekten, wahrend alle weiteren 2m − 2k Objekte jeweils einen eigenen Kasten brauchen. • Insgesamt braucht A f ur I2 mindestens k + 2m − 2k = 2m − k Kasten. • Wegen (∗) muss 2m − k < 34 m gelten, d.h. 2 3m < k. Widerspruch! • Anders ausgedr uckt: Wird I1 optimal verpackt, dann I2 nicht, und umgekehrt. Ein erstes Verfahren, welches recht einfach ist, ist t u 7 83 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) NEXT-FIT (NF): Packe das nachste Objekt in den zuletzt belegten Kasten, wenn m oglich, ansonsten nimm einen neuen. Das Verfahren ist einfach zu programmieren, aber nicht besonders gut, denn Satz 7.4.3 NF braucht zwar h ochstens 2 · OPT Kasten, manchmal aber 2 · OPT − 2. Beweis: NF verwende f ur eine gegebene Eingabefolge k Kasten. • Da der Inhalt von Kasten j + 1 nicht mehr in den Kasten j passt, haben sie zusammen einen Inhalt > 1 (Normierung!). • Also ist der Gesamtinhalt der k Kasten > (je nachdem k gerade oder ungerade ist). • Also braucht eine optimale Packung > k 2 k 2 bzw. bzw. k−1 2 k−1 2 Kasten. • Wahle nun eine Anzahl n von Objekten, die durch 4 teilbar ist. • Die Eingabefolge I bestehe aus n Objekten, abwechselnd von der Gr oe • Optimale Packung: Objekte der Gr oe • Also ist n 4 1 2 paarweise, die ubrigen n 2 1 2 und n2 . der Groe 2 n in einen Kasten. + 1 optimal. • Dagegen muss NF bei jedem Objekt der Gr oe 1 2 einen neuen Kasten nehmen, braucht also n n = 2 · ( + 1) − 2 2 4 Kasten. Besser und auch praktisch gut ist FIRST-FIT (FF): t u • Durchsuche f ur jedes Objekt die bisherigen Kasten der Reihe nach; • packe es in den ersten mit gen ugend freiem Platz; • gibt es keinen, dann nimm einen neuen Kasten. Dies ist leicht zu programmieren, hat aber die Laufzeit O(n2 ), da jeder Kasten jedesmal gepruft wird. Als exakte obere Schranke kann 1.7·OPT nachgewiesen werden, praktisch erhalten wir im Mittel sogar 1.02·OPT. Also ist dieses Verfahren praktisch sehr gut geeignet. 7.4.3 Off-line-Verfahren • Das Hauptproblem bei on-line-Verfahren liegt darin, dass groe Objekte, die spat kommen, nicht gut berucksichtigt werden. • Sortiere daher die Objekte absteigend nach Gr oe (dies braucht O(n · log n)); wende dann First-Fit an. • Dieses Verfahren nennt man First-Fit-Decreasing (FFD). • Unser Ziel: Abschatzung der Kastenzahl. Sei m die optimale Kastenzahl, s1 ≥ . . . ≥ sn die sortierte Objektfolge. Jeder Kasten, den FFD auer den m optimalen benotigt, heie Extrakasten. Lemma 7.4.4 Bei FFD haben alle Objekte in Extrakasten eine Gr oe ≤ 31 . Beweis: Angenommen, das i-te Objekt sei das erste Objekt, das in einen Extrakasten kommt. Dieser hat also die Nummer m + 1. 7 84 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) • Annahme: si > 31 . • Also sind auch s1 , . . . , si−1 > zeigen nun die • Behauptung: Es gibt ein 1 3 , d.h. die Kasten k1 , . . . , km enthalten je hochstens zwei Objekte. Wir j ≤ m, so dass die Kasten k1 , . . . , kj je ein Objekt und kj+1 , . . . , km je zwei Objekte enthalten. • Beweis: Annahme: F ur x < y ≤ m enthalte kx zwei Objekte der Groen x1 , x2 , aber ky nur ein Objekt der Groe y1 . • Dann wurde x1 vor y1 plaziert und x2 vor si . • Also gilt x1 ≥ y1 und x2 ≥ si , d.h. 1 ≥ x1 + x2 ≥ y1 + si . • Dann aber hatte si noch Platz in ky und brauchte nicht einen Extrakasten: Widerspruch! • F ur jede Packung sind nun die s1 , . . . , sj in verschiedenen Kasten, denn sonst hatte FFD zwei zusammen- gepackt. • Bei keiner Packung sind die 2(m − j) + 1 Objekte sj+1 , . . . , si in einem der Kasten k1 , . . . , kj , denn sonst hatte FFD auch hier anders gepackt. • Also sind auch bei einer optimalen Packung diese Objekte in m − j Kasten. • Bei einer Verteilung von 2l + 1 Objekten auf l Kasten muss ein Kasten mindestens drei Objekte enthalten (verallgemeinertes Schubfachprinzip). • Da aber all diese Objekte > 1 3 sind, haben wir einen Widerspruch. Also ist si ≤ 13 . • Da die sx absteigend sortiert sind, und nur sx mit x ≥ i in einen Extrakasten kommt, sind alle diese ≤ 13 . t u Lemma 7.4.5 FFD packt h ochstens m − 1 Objekte in Extrakasten. Beweis: Annahme: Mindestens m Objekte sind in Extrakasten. • Betrachte m davon mit Gr oen x1 , . . . , xm . • Die regularen Kasten ki seien jeweils bis zur H ohe hi gefullt. Dann gilt: n X ≥ = i=1 m X i=1 m X si hi + m X xi i=1 (hi + xi ) i=1 • Die erste Abschatzung ergibt sich, da nur m der Objekte in den Extrakasten betrachtet werden. • xi passt nicht in ki (sonst hatte FFD anders gepackt), also gilt hi + xi > 1. • Es folgt n X si > i=1 • Andererseits, da m das Optimum ist, folgt n X m X 1=m. i=1 si ≤ m, also ein Widerspruch. t u i=1 Satz 7.4.6 (Zusammenfassung) FFD braucht h ochstens Zahl ist. 4 3m + 1 3 Kasten (runden!), wobei m die optimale Beweis: Nach Lemma 7.4.5 enthalten die Extrakasten h ochstens m − 1 Objekte, die nach Lemma 7.4.4 je hochstens 1 3 gro sind. • Also passen mindestens drei dieser Objekte in einen Kasten. 7 85 GIERIGE ALGORITHMEN (GREEDY ALGORITHMS) • Damit reichen h ochstens m−1 3 ≤ m+1 3 Extrakasten, also insgesamt m + m+1 = 43 m + 13 . 3 Eine genauere Analyse ergibt, dass FFD mit hochstens Es gibt aber Folgen, fur die FFD Beispiel 7.4.7 11 9 11 9 t u · OPT + 4 Kasten auskommt. · OPT Kasten braucht. • Eine solche Folge besteht aus je 6m Objekten der Gr oen sowie 12m Objekten der Groe 14 − 2ε. 1 2 + ε, 1 4 + 2ε und • Eine optimale Packung braucht 9m Kasten: Die ersten 6m enthalten je ein Objekt der Gr oe und 12 + ε, die ubrigen je zwei Objekte der Groe 41 − 2ε und zwei der Groe 41 + 2ε. 1 4 1 4 +ε − 2ε, 1 4 +ε • Dagegen braucht FFD 11m Kasten: { In die ersten 6m kommt je ein Objekt der Groe { in die nachsten 2m je drei Objekte der Groe 1 4 { und in die letzten 3m je vier Objekte der Groe 1 2 + ε und 1 4 + 2ε, +ε 1 4 − 2ε. t u In der Praxis verhalt sich FFD aber sehr gut: Sind die Objektgro√en gleichmaig uber das Intervall ]0, 1] verteilt, liegt der Erwartungswert fur die Zahl der Extrakasten in Θ( n).