Gierige Algorithmen Interval Scheduling

Ähnliche Dokumente
Übersicht. Aktivitäten-Auswahl-Problem. Greedy Algorithmen. Aktivitäten-Auswahl-Problem. Aktivitäten-Auswahl-Problem. Datenstrukturen & Algorithmen

Wann sind Codes eindeutig entschlüsselbar?

2. Woche Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung

Greedy Algorithmen. Grundlegendes. Organisatorisches. VL-21: Greedy Algorithmen. (Datenstrukturen und Algorithmen, SS 2017) Gerhard Woeginger

Referat zum Thema Huffman-Codes

16 - Kompressionsverfahren für Texte

Einführung in die Informatik II Aus der Informationstheorie: Datenkompression

Kompressionsverfahren für Texte

Randomisierte Algorithmen 2. Erste Beispiele

Datenkompression. 1 Allgemeines. 2 Verlustlose Kompression. Holger Rauhut

Greedy Algorithms - Gierige Algorithmen

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Mathematik für Information und Kommunikation

2.7 Der Shannon-Fano-Elias Code

Divide & Conquer. Problem in Teilprobleme aufteilen Teilprobleme rekursiv lösen Lösung aus Teillösungen zusammensetzen

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Sortieren & Co. KIT Institut für Theoretische Informatik

Problem: Finde für Alphabet mit n Zeichen einen Binärcode, der die Gesamtlänge eines Textes (über diesem Alphabet) minimiert.

6 Ü B E R S E T Z U N G E N U N D C O D I E R U N G E N. 6.1 von wörtern zu zahlen und zurück Dezimaldarstellung von Zahlen Num 10

S=[n] Menge von Veranstaltungen J S kompatibel mit maximaler Größe J

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Textkompression. Komprimierung von Daten. Runlength Komprimierung (2) Runlength Komprimierung (1) Herkömmliche Kodierung. Runlength Komprimierung (3)

Suchen und Sortieren Sortieren. Heaps

15 Optimales Kodieren

Dynamisches Huffman-Verfahren

3. Binäre Suchbäume. 3.1 Natürliche binäre Suchbäume. EADS 3.1 Natürliche binäre Suchbäume 78/598 ľernst W. Mayr

1.5 Turing-Berechenbarkeit

Übung zur Vorlesung Algorithmische Geometrie

Molekulare Bioinformatik

Algorithmische Bioinformatik 1

Erinnerung: das Knapsack-Problem

Kapitel 2. Weitere Beispiele Effizienter Algorithmen

10. Sortieren III. Untere Schranken für das vergleichsbasierte Sortieren, Radix- und Bucketsort

Seminar Kompressionsalgorithmen Huffman-Codierung, arithmetische Codierung

1.5 Turing-Berechenbarkeit

Lemma Für jede monotone Grammatik G gibt es eine kontextsensitive

Relationen und DAGs, starker Zusammenhang

Effiziente Algorithmen 2

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Einführung in die Informatik 2

String - Matching. Kapitel Definition

16. All Pairs Shortest Path (ASPS)

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Grundlagen der Theoretischen Informatik

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Heapsort

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Diskrete Strukturen Kapitel 4: Graphentheorie (Bäume)

6. Komprimierung. (Text)komprimierung ist ein Wechsel der Repräsentation von Daten, so daß sie weniger

Algorithmen und Datenstrukturen (für ET/IT)

Mächtigkeit von WHILE-Programmen

Theoretische Informatik. Exkurs: Komplexität von Optimierungsproblemen. Optimierungsprobleme. Optimierungsprobleme. Exkurs Optimierungsprobleme

Einführung in die Theoretische Informatik

Heapsort / 1 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Informatik II Greedy-Algorithmen

Kodierungsalgorithmen

Algorithmen und Komplexität Lösungsvorschlag zu Übungsblatt 8

lim log 2n n = > 0 Da es einen Limes gibt, gibt es auch einen Limes inferior, der gleich diesem Limes ist.

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

4 Greedy-Algorithmen (gierige Algorithmen)

Grundlagen: Algorithmen und Datenstrukturen

13. Binäre Suchbäume

19. Dynamic Programming I

Kryptographie und Codierung für den Mathematikunterricht

Klausur Informatik-Propädeutikum (Niedermeier/Hartung/Nichterlein, Wintersemester 2012/13)

Codes und Codierung. Dr. Michael Hielscher

Natürliche Bäume. (Algorithmen und Datenstrukturen I) Prof. Dr. Oliver Braun. Letzte Änderung: :16. Natürliche Bäume 1/16

Tutorium 23 Grundbegriffe der Informatik (6. Sitzung)

Lösungen zur 1. Klausur. Einführung in Berechenbarkeit, formale Sprachen und Komplexitätstheorie

Algorithmentheorie. 10 Greedy Verfahren

Effiziente Algorithmen und Komplexitätstheorie

Vortrag 20: Kurze Vektoren in Gittern

13. Bäume: effektives Suchen und Sortieren

Grundlagen der Theoretischen Informatik

Informatik II Greedy-Algorithmen

Strings. Stringsuche, Boyer-Moore, Textkompression, Huffman Codes.

8.4 Digraphen mit negativen Kantengewichten Grundsätzliches Betrachte Startknoten s und einen Kreis C mit Gesamtlänge < 0.

Triangulierungen von Punktmengen und Polyedern

Information Modellierung Shannon Fano Praxis. Entropie. Ingo Blechschmidt, Michael Hartmann. 15. November 2006

2. Algorithmische Methoden 2.1 Rekursion. 18. April 2017

Grundlagen: Algorithmen und Datenstrukturen

Transkript:

Gierige Algorithmen Interval Scheduling IntervalScheduling(s,f). n length[s] 2. A {} 3. j 4. for i 2 to n do 5. if s[i] f[j] then 6. A A {i} 7. j i 8. return A

Gierige Algorithmen Interval Scheduling Beweisidee: Der gierige Algorithmus liegt vorn Wir messen Fortschritt des Algorithmus Schritt für Schritt Zeige: Der gierige Algorithmus macht mindestens genau so viel Fortschritt wie jeder beliebige andere Algorithmus Beobachtung: A ist eine Menge von kompatiblen Anfragen. 2

Gierige Algorithmen Interval Scheduling Wie können wir Optimalität zeigen? Sei O optimale Menge von Intervallen u. U. viele optimale Lösungen Wir zeigen: A = O 3

Gierige Algorithmen Interval Scheduling Wie können wir Optimalität zeigen? Sei O optimale Menge von Intervallen u. U. viele optimale Lösungen Wir zeigen: A = O 4

Gierige Algorithmen Interval Scheduling Notation: i,, i Intervalle von A in Ordnung des Hinzufügen j,, j Intervalle von O sortiert nach Endpunkt k m Zu zeigen: k = m i i 2 i 3 j j i 3 4 j 2 j 4 5

Gierige Algorithmen Interval Scheduling Der gierige Algorithmus liegt vorn: Idee des Algorithmus: Die Resource soll so früh wie möglich wieder frei werden Dies ist war für das erste Interval: f[i ] f[j ] Zu zeigen: Gilt für alle Intervalle i i 2 i 3 j j i 3 4 j 2 j 4 6

Gierige Algorithmen Interval Scheduling Lemma 8.4: Für alle r k gilt f[i r ] f[j ]. r i i 2 i 3 j j i 3 4 j 2 j 4 7

Gierige Algorithmen Interval Scheduling Lemma 8.4: Für alle r k gilt f[i r ] f[j ]. r f[i ], f[j ] i i 2 i 3 j j i 3 4 j 2 j 4 8

Gierige Algorithmen Interval Scheduling Lemma 8.4: Für alle r k gilt f[i r ] f[j ]. r f[i ] 2 i i 2 i 3 j j i 3 4 j 2 f[j ] 2 j 4 9

Gierige Algorithmen Interval Scheduling Lemma 8.4: Für alle r k gilt f[i r ] f[j ]. r f[i ] f[j ] 3 3 i i 2 i 3 j j i 3 4 j 2 j 4 0

Gierige Algorithmen Interval Scheduling Lemma 8.4: Für alle r k gilt f[i r ] f[j ]. r f[i ] 4 f[j ] i 4 i 2 i 3 j j i 3 4 j 2 j 4

Gierige Algorithmen Interval Scheduling Satz 8.5: Die von Algorithmus IntervalSchedule berechnete Lösung A ist optimal. i i 2 i 3 j j i 3 4 j 2 j 4 2

Gierige Algorithmen Interval Scheduling IntervalScheduling(s,f). n length[s] 2. A {} 3. j 4. for i 2 to n do 5. if s[i] f[j] then 6. A A {i} 7. j i 8. return A 3

Gierige Algorithmen Interval Scheduling IntervalScheduling(s,f). n length[s] 2. A {} Θ() 3. j 4. for i 2 to n do 5. if s[i] f[j] then 6. A A {i} 7. j i 8. return A 4

Gierige Algorithmen Interval Scheduling IntervalScheduling(s,f). n length[s] 2. A {} Θ() 3. j 4. for i 2 to n do 5. if s[i] f[j] then 6. A A {i} Θ(n) 7. j i 8. return A 5

Gierige Algorithmen Interval Scheduling IntervalScheduling(s,f). n length[s] 2. A {} Θ() 3. j 4. for i 2 to n do 5. if s[i] f[j] then 6. A A {i} Θ(n) 7. j i 8. return A Θ() 6

Gierige Algorithmen Interval Scheduling IntervalScheduling(s,f). n length[s] 2. A {} Θ() 3. j 4. for i 2 to n do 5. if s[i] f[j] then 6. A A {i} Θ(n) 7. j i 8. return A Θ() Θ(n) 7

Gierige Algorithmen Interval Scheduling Satz 8.6: Algorithmus IntervalSchedule berechnet in Θ(n) Zeit eine optimale Lösung, wenn die Eingabe nach Endzeit der Intervalle (rechter Endpunkt) sortiert ist. Die Sortierung kann in Θ(n log n) Zeit berechnet werden. 8

Berechne Lösung schrittweise In jedem Schritt mache lokal optimale Wahl Daumenregel: Wenn optimale Lösung eines Problems eine optimale Lösung von Teilproblemen enthält, dann gibt es häufig einen gierigen Algorithmus Algorithmen: Scheduling Probleme 9

Datenkompression Reduziert Größen von Files Viele Verfahren für unterschiedliche Anwendungen: MP3, MPEG, JPEG, Wie funktioniert Datenkompression? Zwei Typen von Kompression: Verlustbehaftete Kompression (Bilder, Musik, Filme, ) Verlustfreie Kompression (Programme, Texte, Excel-Dateien, ) 20

Datenkompression Reduziert Größen von Files Viele Verfahren für unterschiedliche Anwendungen: MP3, MPEG, JPEG, Wie funktioniert Datenkompression? Zwei Typen von Kompression: Verlustbehaftete Kompression (Bilder, Musik, Filme, ) Verlustfreie Kompression (Programme, Texte, Excel-Dateien, ) 2

Kodierung: Computer arbeiten auf Bits (Symbole 0 und ), nutzen also das Alphabet {0,} Menschen nutzen umfangreichere Alphabete (z.b. Alphabete von Sprachen) Darstellung auf Rechner erfordert Umwandlung in Bitfolgen 22

Beispiel: Alphabet Σ={a,b,c,d,,x,y,z,,.,:,!,?,&} (32 Zeichen) 5 Bits pro Symbol: 2 =32 Möglichkeiten 5 a b z. :!? & 00000 0000 00 00 0 00 0 0 23

Beispiel: Alphabet Σ={a,b,c,d,,x,y,z,,.,:,!,?,&} (32 Zeichen) 5 Bits pro Symbol: 2 =32 Möglichkeiten a b z. :!? & 00000 0000 00 00 0 00 0 0 Optimal? 5 4 Bits pro Symbol nicht genug Müssen im Durchschnitt 5 Bits für langen Text verwenden? 24

Beobachtung: Nicht jeder Buchstabe kommt gleich häufig vor Z.B. kommen x,y und z in Deutsch viel seltener vor als e,n oder r 25

Beobachtung: Nicht jeder Buchstabe kommt gleich häufig vor Z.B. kommen x,y und z in Deutsch viel seltener vor als e,n oder r Idee: Benutze kurze Bitstrings für Symbole die häufig vorkommen 26

Beobachtung: Nicht jeder Buchstabe kommt gleich häufig vor Z.B. kommen x,y und z in Deutsch viel seltener vor als e,n oder r Idee: Benutze kurze Bitstrings für Symbole die häufig vorkommen Effekt: Gesamtlänge der Kodierung einer Symbolfolge (eines Textes) wird reduziert 27

Grundlegendes Problem: Eingabe:Text in Alphabet Σ Gesucht: Eine binäre Kodierung von Σ, so dass die Länge des Textes in dieser Kodierung minimiert wird Beispiel: Σ={0,,2,,9} Text = 0025590004356789 (7 Zeichen) 0 2 3 4 5 6 7 8 9 0000 000 000 00 000 00 00 0 000 00 28

Grundlegendes Problem: Eingabe:Text in Alphabet Σ Gesucht: Eine binäre Kodierung von Σ, so dass die Länge des Textes in dieser Kodierung minimiert wird Beispiel: Länge der Kodierung: Σ={0,,2,,9} 4 7 = 68 Bits Text = 0025590004356789 (7 Zeichen) 0 2 3 4 5 6 7 8 9 0000 000 000 00 000 00 00 0 000 00 29

Grundlegendes Problem: Eingabe:Text in Alphabet Σ Gesucht: Eine binäre Kodierung von Σ, so dass die Länge des Textes in dieser Kodierung minimiert wird Beispiel: Σ={0,,2,,9} Text = 0025590004356789 (7 Zeichen) 0 2 3 4 5 6 7 8 9 0 000 00 00 0 0 00 0 0 30

Grundlegendes Problem: Eingabe:Text in Alphabet Σ Gesucht: Eine binäre Kodierung von Σ, so dass die Länge des Textes in dieser Kodierung minimiert wird Länge der Kodierung: Beispiel: 5 + 3 2 + 9 5 = 56 Bits Σ={0,,2,,9} Text = 0025590004356789 (7 Zeichen) 0 2 3 4 5 6 7 8 9 0 000 00 00 0 0 00 0 0 3

Grundlegendes Problem: Eingabe:Text in Alphabet Σ Gesucht: Eine binäre Kodierung von Σ, so dass die Länge des Textes in dieser Kodierung minimiert wird Länge der Kodierung: Beispiel: 5 + 3 2 + 9 5 = 56 Bits Σ={0,,2,,9} Text = 0025590004356789 (7 Zeichen) 0 2 3 4 5 6 7 8 9 0 000 00 00 0 0 00 0 0 32

Grundlegendes Problem: Eingabe:Text in Alphabet Σ Gesucht: Eine binäre Kodierung von Σ, so dass die Länge des Textes in dieser Kodierung minimiert wird Länge der Kodierung: Beispiel: 5 + 3 2 + 9 5 = 56 Bits Σ={0,,2,,9} Text = 0025590004356789 (7 Zeichen) 0 2 3 4 5 6 7 8 9 0 000 00 00 0 0 00 0 0 33

Grundlegendes Problem: Eingabe:Text in Alphabet Σ Gesucht: Eine binäre Kodierung von Σ, so dass die Länge des Textes in dieser Kodierung minimiert wird Länge der Kodierung: Beispiel: 5 + 3 2 + 9 5 = 56 Bits Σ={0,,2,,9} Text = 0025590004356789 (7 Zeichen) 0 2 3 4 5 6 7 8 9 0 000 00 00 0 0 00 0 0 34

MorseCode: Elektrische Pulse über Kabel Punkte (kurze Pulse) Striche(Lange Pulse) Beispiele aus dem MorseCode: e ist 0 (ein einzelner Punkt) t ist (ein einzelner Strich) a ist 0 (Strich Punkt) Problem: Ist 00 eta, aa, etet, oder aet? 35

Problem Mehrdeutigkeit: Ist die Kodierung eines Buchstaben Präfix der Kodierung eines anderen Buchstaben, dann ist die Kodierung nicht immer eindeutig Beispiel: e = 0, a = 0 0 ist Präfix von 0 36

Präfix-Kodierung: Eine Präfix-Kodierung für ein Alphabet Σ ist eine Funktion γ, die jeden Buchstaben x Σ auf eine endliche Sequenz von 0 und abbildet, so dass für x,y Σ, x y, die Sequenz γ(x) nicht Präfix der Sequenz γ(y) ist. 37

Präfix-Kodierung: Eine Präfix-Kodierung für ein Alphabet Σ ist eine Funktion γ, die jeden Buchstaben x Σ auf eine endliche Sequenz von 0 und abbildet, so dass für x,y Σ, x y, die Sequenz γ(x) nicht Präfix der Sequenz γ(y) ist. Beispiel (Präfix-Kodierung): x Σ 0 2 3 4 5 6 7 8 9 γ(x) 00 000 00 0 00 00 0 0 0 38

Definition (Frequenz) Die Frequenz f[x] eines Buchstaben x Σ bezeichnet den Bruchteil der Buchstaben im Text, die x sind. Beispiel: Σ = {0,,2} Text = 00002200 f[0] = 3/5 f[] = /5 f[2] = /5 39

Definition (Kodierungslänge) Die Kodierungslänge eines Textes mit n Zeichen bzgl. einer Kodierung γ ist gegeben durch Beispiel: Kodierungslänge = Σ n f[x] γ(x) x Σ Σ = {a,b,c,d} γ(a) = 0; γ(b) =0; γ(c)= 0; γ(d)= Text = aacdaabb Kodierungslänge = 6 40

Definition (Kodierungslänge) Anzahl der Vorkommen von x im Die Kodierungslänge eines Textes mit n Text Zeichen bzgl. einer Kodierung γ ist gegeben durch Beispiel: Kodierungslänge = Σ n f[x] γ(x) x Σ Σ = {a,b,c,d} γ(a) = 0; γ(b) =0; γ(c)= 0; γ(d)= Text = aacdaabb Kodierungslänge = 6 4

Definition (Kodierungslänge) Länge Die Kodierungslänge eines Textes mit n Zeichen bzgl. der einer Kodierung γ ist gegeben durch Beispiel: Σ = {a,b,c,d} Kodierungslänge = Σ n f[x] γ(x) x Σ γ(a) = 0; γ(b) =0; γ(c)= 0; γ(d)= Text = aacdaabb Kodierungslänge = 6 Codierung von x 42

Definition (durchschn. Kodierungslänge) Die durchschnittliche Kodierungslänge eines Textes mit n Zeichen bzgl. einer Kodierung γ ist gegeben durch Beispiel: ABL(γ) = Σ f[x] γ(x) Σ = {a,b,c,d} γ(a) = 0; γ(b) =0; γ(c)= 0; γ(d)= Text = aacdaabb Durchschnittliche Kodierungslänge = 6/8 = 2 x Σ 43

Optimale Präfix-Kodierung: Problem: Optimale Präfix-Kodierung Eingabe: Alphabet Σ; für jedes x Σ seine Frequenz f[x] Ausgabe: Eine Kodierung γ, die ABL(γ) minimiert 44

Kodierungen und Binärbäume: a b d c 45

Kodierungen und Binärbäume: 0 0 b a 0 d c 46

Kodierungen und Binärbäume: a 0 d 0 x Σ γ(x) b a 00 b 0 c 0 c d 00 47

Kodierungen und Binärbäume: x Σ γ(x) a b 0 c 00 d 0 48

Kodierungen und Binärbäume: x Σ γ(x) a b 0 c 00 d 0 0 0 0 c b d a 49

Definition: Die Tiefe eines Baumknotens ist die Länge seines Pfades zur Wurzel. 0 0 b a 0 d c Tiefe(c) = 3 50

Neue Problemformulierung: Suche Binärbaum, dessen Blätter die Symbole aus Σ sind und der minimiert. ABL(T) = Σ f[x] Tiefe(x) x S 5

Definition: Ein Binärbaum heißt voll, wenn jeder innere Knoten zwei Kinder hat. 0 0 b a 0 d c Ein voller Binärbaum 52

Definition: Ein Binärbaum heißt voll, wenn jeder innere Knoten zwei Kinder hat. 0 0 b a d 0 Ein nicht voller Binärbaum, da der rote innere Knoten keine zwei Kinder hat 53

Lemma 6: Ein Binärbaum, der einer optimalen Präfix-Kodierung entspricht, ist voll. 0 b 0 d a 54

Lemma 6: Ein Binärbaum, der einer optimalen Präfix-Kodierung entspricht, ist voll. u d Beweis: 0 Annahme: T ist optimal und hat inneren Knoten u mit einem b Kind v Ersetze u durch v v Dies verkürzt die Tiefe einiger 0 Knoten, erhöht aber keine Tiefe Damit verbessert man die a Kodierung 55

Lemma 6: Ein Binärbaum, der einer optimalen Präfix-Kodierung entspricht, ist voll. d 0 v 0 a b Beweis: Annahme: T ist optimal und hat inneren Knoten u mit einem Kind v Ersetze u durch v Dies verkürzt die Tiefe einiger Knoten, erhöht aber keine Tiefe Damit verbessert man die Kodierung 56

Ein Gedankenexperiment: Angenommen, jemand gibt uns den optimalen Baum T*, aber nicht die Bezeichnung der Blätter Wie schwierig ist es, die Bezeichnungen zu finden? 57

Lemma 7: Seien u und v sind Blätter von T* mit Tiefe(u) <Tiefe(v). Seien u bzw. v in einer optimalen Kodierung mit y Σ bzw. z Σ bezeichnet. Dann gilt f[y] f[z]. 0 0 u y 0 v z 58

Lemma 7: Seien u und v sind Blätter von T* mit Tiefe(u) <Tiefe(v). Seien u bzw. v in einer optimalen Kodierung mit y Σ bzw. z Σ bezeichnet. Dann gilt f[y] f[z]. 0 0 0 x Σ f[x] a 0% b 2% c 8% d 60% 59

Lemma 7: Seien u und v sind Blätter von T* mit Tiefe(u) <Tiefe(v). Seien u bzw. v in einer optimalen Kodierung mit y Σ bzw. z Σ bezeichnet. Dann gilt f[y] f[z]. 0 0 d x Σ f[x] a 0% b 2% c 8% 0 d 60% 60

Lemma 7: Seien u und v sind Blätter von T* mit Tiefe(u) <Tiefe(v). Seien u bzw. v in einer optimalen Kodierung mit y Σ bzw. z Σ bezeichnet. Dann gilt f[y] f[z]. c 0 0 0 d x Σ f[x] a 0% b 2% c 8% d 60% 6

Lemma 7: Seien u und v sind Blätter von T* mit Tiefe(u) <Tiefe(v). Seien u bzw. v in einer optimalen Kodierung mit y Σ bzw. z Σ bezeichnet. Dann gilt f[y] f[z]. c 0 0 0 d x Σ f[x] a 0% b 2% c 8% d 60% b 62

Lemma 7: Seien u und v sind Blätter von T* mit Tiefe(u) <Tiefe(v). Seien u bzw. v in einer optimalen Kodierung mit y Σ bzw. z Σ bezeichnet. Dann gilt f[y] f[z]. c 0 0 0 d x Σ f[x] a 0% b 2% c 8% d 60% b a 63

Lemma 7: Seien u und v sind Blätter von T* mit Tiefe(u) <Tiefe(v). Seien u bzw. v in einer optimalen Kodierung mit y Σ bzw. z Σ bezeichnet. Dann gilt f[y] f[z]. c 0 0 0 d x Σ f[x] a 0% b 2% Anordnung innerhalb einer Tiefenstufe ist egal! c 8% d 60% a b 64

Beobachtung Sei v der tiefste Blattknoten in T*. Dann hat v einen Bruder und dieser ist ebenfalls ein Blattknoten. 0 0 d c 0 a w (Bruder von v) b v 65

Beobachtung Sei v der tiefste Blattknoten in T*. Dann hat v einen Bruder und dieser ist ebenfalls ein Blattknoten. c 0 0 0 d Beweis: Da ein optimaler Baum voll ist, hat v einen Bruder w Wäre w kein Blatt, dann hätte ein Nachfolger von w größere Tiefe als v a w (Bruder von v) b v 66

Zusammenfassende Behauptung Es gibt eine optimale Präfix-Kodierung mit zugehörigem Baum T*, so dass die beiden Blattknoten, denen die Symbole mit den kleinsten Frequenzen zugewiesen wurden, Bruderknoten in T* sind. 67

Zusammenfassende Behauptung Es gibt eine optimale Präfix-Kodierung mit zugehörigem Baum T*, so dass die beiden Blattknoten, denen die Symbole mit den kleinsten Frequenzen zugewiesen wurden, Bruderknoten in T* sind. 0 x Σ f[x] a 0% c 0 0 d b 2% c 8% d 60% a b 68

Behauptung Es gibt eine optimale Präfix-Kodierung mit zugehörigem Baum T*, so dass die beiden Blattknoten, denen die Symbole mit den kleinsten Frequenzen zugewiesen wurden, Bruderknoten in T* sind. c 0 0 0 d x Σ f[x] a 0% b 2% a und b erfüllen die Bedingungen der Behauptung! c 8% d 60% a b 69

Idee des Algorithmus: Die beiden Symbole y* und z* mit den niedrigsten Frequenzen sind Bruderknoten Fasse y* und z* zu einem neuen Symbol zusammen Löse das Problem für die übrigen n- Symbole (z.b. rekursiv) y* z* 70

Idee des Algorithmus: Die beiden Symbole y* und z* mit den niedrigsten Frequenzen sind Bruderknoten Fasse y* und z* zu einem neuen Symbol zusammen Löse das Problem für die übrigen n- Symbole (z.b. rekursiv) y*z* 7

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% d 0% 72

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% d 0% 73

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% d 0% Q: 23% 2% 55% 0% 74

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i= d 0% Q: 23% 2% 55% 0% 75

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i= d 0% Q: 23% 2% 55% x: 0% 76

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i= d 0% Q: 23% 55% x: y: 0% 2% 77

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i= d 0% Q: 23% 55% z: 22% 0% 2% 78

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i= d 0% Q: 23% 55% z: 22% 0% 2% 79

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i= d 0% Q: 23% 55% 22% 0% 2% 80

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i=2 d 0% Q: 23% 55% 22% 0% 2% 8

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i=2 d 0% Q: 23% 55% x: 22% 0% 2% 82

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) i=2 Q: 55% x Σ x: 22% y: 0% 2% f[x] a 23% b 2% c 55% d 0% 23% 83

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i=2 d 0% Q: 55% z: 22% 0% 2% 45% 23% 84

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i=2 d 0% Q: 55% z: 22% 0% 2% 45% 23% 85

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i=2 d 0% Q: 55% 45% 22% 23% 0% 2% 86

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) x Σ f[x] a 23% b 2% c 55% i=3 d 0% Q: 55% 45% 22% 23% 0% 2% 87

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) Q: x Σ f[x] a 23% b 2% c 55% i=3 d 0% 55% x: 22% 0% 2% 45% 23% 88

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) Q: i=3 x Σ f[x] a 23% b 2% c 55% d 0% x: y: 22% 0% 2% 45% 55% 23% 89

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) Q: z: i=3 22% 0% 2% x Σ f[x] a 23% b 2% c 55% d 0% 00% 45% 55% 23% 90

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) Q: z: i=3 22% 0% 2% x Σ f[x] a 23% b 2% c 55% d 0% 00% 45% 55% 23% 9

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) Q: i=3 22% 0% 2% x Σ f[x] a 23% b 2% c 55% d 0% 00% 45% 55% 23% 92

Huffmann(C). n C 2. Q C 3. for i to n- do 4. x Extract_Min(Q) 5. y Extract_Min(Q) 6. z new BinTree(x, f[x]+f[y],y) 7. f[z] f[x] + f[y] 8. Q Q {z} 9. return Extract_Min(Q) Q: i=3 22% 0% 2% x Σ f[x] a 23% b 2% c 55% d 0% 00% 45% 55% 23% 93

Satz 8 Algorithmus Huffman(C) berechnet eine optimale Präfix- Kodierung. 94

Gierige Algorithmen: Berechne Lösung schrittweise In jedem Schritt mache lokal optimale Wahl Anwendbar: Wenn optimale Lösung eines Problems optimale Lösung von Teilproblemen enthält Algorithmen: Scheduling Probleme Optimale Präfix-Kodierung (Huffman Codes) 95