(nach folien von prof. martin dietzfelbinger) · greedy -algorithmen sind anwendbar bei...
Post on 19-Jun-2019
220 Views
Preview:
TRANSCRIPT
Effiziente Algorithmen
Greedy-Algorithmen
Vorlesender: Martin Aumuller(nach Folien von Prof. Martin Dietzfelbinger)
Mai 2012
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 1
Kapitel 3: Greedy-AlgorithmenGreedy∗-Algorithmen sind anwendbar bei Konstruktionsaufgaben zumFinden einer optimalen Struktur.
Sie finden eine Losung, die sie schrittweise aufbauen, ohne zuruckzusetzen.Es werden dabei nicht mehr Teillosungen konstruiert als unbedingt notig.
∗ greedy (engl.): gierig.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 2
3.1 Zwei BeispieleBeispiel 1: Horsaalbelegung
Gegeben: Veranstaltungsort (Horsaal), Zeitspanne [T0,T1) und eineMenge von n Aktionen (Vorlesungen oder ahnliches), durch Start- undEndzeit spezifiziert:
[si , fi ), fur 1 ≤ i ≤ n.
Gesucht: Belegung des Horsaals, die moglichst viele Ereignisse mitdisjunkten Zeitspannen stattfinden lasst.
Nenne eine Menge A ⊆ {1, . . . , n} zulassig, wenn alle [si , fi ), i ∈ A,disjunkt sind.
Aufgabe, formal: Finde zulassige Menge A mit |A| so groß wie moglich.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 3
T0
T1
Eingabe: Aktionen mit Beginn und Ende
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 4
T0T
1
Zulassige Losung mit 4 Aktionen. Optimal?
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 5
T0T
1
Zulassige Losung mit 5 Aktionen. Optimal?
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 6
Ansatze, die nicht funktionieren:
Zuerst kurze Ereignisse planen
T0T
1
Immer ein Ereignis mit moglichst fruher Anfangszeit wahlen
T0T
1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 7
Trick: Bearbeite Ereignisse nach wachsenden Schlusszeiten. O.B.d.A.:Veranstaltungen nach Schlusszeiten aufsteigend sortiert (ZeitaufwandO(n log n)), also:
f1 ≤ f2 ≤ · · · ≤ fn.
1T
0T
1
2
3
4
5
6
7
8
9
10
11
12
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 8
Wiederhole: Wahle die wahlbare Aktion mit der kleinsten Schlusszeitund fuge sie zum Belegungsplan hinzu.
Eine Aktion ist wahlbar, wenn ihre Startzeit mindestens so groß wie dieSchlusszeit der letzten schon geplanten Veranstaltung ist.
1T
0T
Ausgabe von GS: Zulassige Losung.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 9
Algorithmus Greedy Scheduling (GS)Eingabe: [T0,T1), [s1, f1), . . . , [sn, fn), nichtleere
reelle Intervalle, [si , fi ) ⊆ [T0,T1)Ausgabe: Maximal großes A ⊆ {1, . . . , n} mit
[si , fi ), i ∈ A disjunkt(1) Sortiere Intervalle gemaß f1, . . . , fn aufsteigend;(2) A← {1};(3) flast ← f1;(4) for i from 2 to n do(5) if si ≥ flast then (∗ [si, fi) wahlbar ∗)(6) A← A ∪ {i};(7) flast ← fi;(8) return A
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 10
Satz 3.1.1
Der Algorithmus Greedy Scheduling (GS) hat lineare Laufzeit (bis auf dieSortierkosten von O(n log n)) und lost das Horsaalplanungsproblemoptimal.
Beweis: Laufzeit: Sortieren kostet Zeit O(n log n); der restlicheAlgorithmus hat offensichtlich Laufzeit O(n).
Korrektheit: Wir behaupten: Algorithmus GS liefert auf Inputs mit Großen eine optimale Losung, und beweisen dies durch vollstandige Induktion.
Der Fall n = 1 ist trivial.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 11
Sei nun n > 1.
I.V.: GS liefert fur Inputs der Lange n′ < n eine optimale Losung.
Ind.-Schritt: Sei B ⊆ {1, . . . , n} eine optimale Losung, |B| = r . (ImBeispiel: r = 5.)
1T
0T
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 12
1. Beobachtung:Es gibt eine Losung B ′, die mit dem Intervall [s1, f1) (dem ersten Schrittdes Greedy-Algorithmus) startet und ebenfalls r Ereignisse hat. (Also istB ′ auch optimal.)
1T
0T
Setze B ′ := (B − {min(B)}) ∪ {1}.Intervalle aufsteigend sortiert ⇒ f1 ≤ fmin(B).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 13
2. Beobachtung:
Die Menge B − {min(B)} lost das Teilproblem
(∗) [f1,T1), {[si , fi) | si ≥ f1}
optimal, das heißt:in [f1,T1) konnen maximal r − 1 Ereignisse untergebracht werden.
Wieso? Sonst wurden wir [s1, f1) mit einer besseren Losung fur (∗) zu einerbesseren Losung fur das Gesamtproblem kombinieren: Widerspruch zurOptimalitat von B.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 14
3. Beobachtung:
Algorithmus GS auf Eingabe {[si , fi ) | 1 ≤ i ≤ n} hat ab Iteration i = 2genau dasselbe Verhalten wie wenn man GS auf [f1,T1),{[si , fi ) | si ≥ f1} starten wurde.Nach I.V. liefert also dieser Teil des Algorithmus eine optimale Losung mitr − 1 Ereignissen fur (∗).
Also liefert Greedy Scheduling insgesamt eine optimale Losung der Großer . �
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 15
Beispiel 2: Fraktionales (”
teilbares“) Rucksackproblem
Veranschaulichung: Ein Dieb stiehlt Sackchen mit Edelmetallkrumeln, diebeliebig teilbar sind. Der Wert pro Volumeneinheit ist unterschiedlich furunterschiedliche Materialien. Was soll er in seinen Rucksack mit Volumen bpacken, um den Wert zu maximieren?
Gegeben: n Objekte mit positiven Volumina a1, . . . , an und positivenNutzenwerten c1, . . . , cn,sowie eine Volumenschranke b.
Gesucht: Vektor (λ1, . . . , λn) ∈ [0, 1]n, so dass
λ1a1 + . . .+ λnan ≤ b (”
zulassig“)
undλ1c1 + . . .+ λncn maximal.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 16
Beim”
0-1-Rucksackproblem“ werden nur 0-1-Vektoren mit λi ∈ {0, 1}zugelassen.
Mitteilung (im Vorgriff auf BuK, 5. Sem.): Die {0, 1}-Version ist NP-vollstandig,besitzt also wahrscheinlich keinen effizienten Algorithmus.
Das fraktionale Rucksackproblem ist mit einem Greedy-Algorithmus in ZeitO(n log n) losbar.
Kern der Losungsidee: Berechne”
Nutzendichte“
di = ci/ai , 1 ≤ i ≤ n,
und sortiere die Objekte gemaß di fallend.
Nehme von vorne beginnend moglichst viele ganze Objekte, bis schließlichdas letzte Objekt teilweise genommen wird, so dass die Gewichtsschrankevollstandig ausgenutzt wird.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 17
ba
321 aaa n
c c
c
1 2 3
n
c
Input, sortiert nach Nutzendichte di = ci/ai .
Hohe von Kasten Nummer i ist di = ci/ai .
Breite ist ai.
Flache ist ci.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 18
Algorithmus Greedy Fractional Knapsack (GFKS)(1) for i from 1 to n do(2) di ← ci/ai;(3) λi ← 0;(4) Sortiere Objekte gemaß di fallend;(5) i← 0;(6) r← b; (* Inhalt r ist das verfugbare Rest-Volumen *)(7) while r > 0 do(8) i++;(9) if ai ≤ r
(10) then λi ← 1; r← r− ai;(11) else λi ← r/ai;(12) r← 0;
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 19
ba
321 aaa n
c c
c
1 2 3
n
c
Vom Greedy-Algorithmus gelieferte Losung.Gesamtnutzen: grun.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 20
b321 aaaan
c c
c
1 2 3
n
c
Zulassige Losung, nicht optimal. Gesamtnutzen: blau.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 20
b321 aaaan
c c
c
1 2 3
n
c
b2 aa na 3a 1
2 3
n
c c c
c
1
Anschaulich: Greedy-Losung nie schlechter als beliebige Losung.Gleich: Vollstandiger Beweis.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 21
Satz 3.1.2
Der Algorithmus GFKS ist korrekt (liefert eine zulassige Losung mitmaximalem Gesamtnutzen) und hat Laufzeit O(n log n).
Beweis: Sei x = (a1, . . . , an, c1, . . . , cn, b) die Eingabe.
O.B.d.A.:∑
i ai > b (sonst ist (λ1, . . . , λn) = (1, . . . , 1) optimal und wirdvon GFKS gefunden).
Sei (λ1, . . . , λn) ∈ [0, 1]n die Ausgabe des Algorithmus.
Laufzeit: klar.
Korrektheit: Zulassigkeit klar. Zu zeigen: Optimalitat.
Sei (λ′1, . . . , λ′n) ∈ [0, 1]n eine optimale Losung.
Offensichtlich:∑
i λ′iai = b (sonst verbesserbar).
Durch Induktion uber n zeigen wir:∑
i λici =∑
i λ′ici .
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 22
I.A.: n = 1. Dann liefert der Algorithmus offensichtlich die optimaleLosung: Packe genau den Bruchteil λ1 = b/a1, der in den Rucksack passt.
Ind.-Schritt: n > 1.
1. Fall: a1 ≥ b.
GFKS wahlt λ1 = b/a1, und das ist optimal: Weil d1 ≥ di fur alle i , gilt:
λ1c1 = bd1 = (∑
i λ′iai )d1 ≥
∑i λ′iaidi =
∑i λ′ici .
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 23
(Ind.-Schritt:) 2. Fall: a1 < b.
Behauptung: Wir konnen o.B.d.A. λ′1 = 1 annehmen.
(”Der erste Schritt des Greedy-Algorithmus ist nicht falsch.“)
Denn: Wenn λ′1 < 1, kann man wegen∑
1≤i≤n λ′iai = b
Werte λ′′1 = 1, 0 ≤ λ′′2 ≤ λ′2, . . . , 0 ≤ λ′′n ≤ λ′n finden, so dass
(1− λ′1)a1 =∑
2≤i≤n(λ′i − λ′′i )ai . (∗)
(Verringere Gewicht bei”spateren“ Objekten zugunsten von Objekt 1.)
Dann ist (λ′′1, . . . , λ′′n) zulassig und∑
i
λ′′i ci =∑i
λ′ici +(
(1− λ′1)a1d1 −∑
2≤i≤n(λ′i − λ′′i )aidi
).
Aus (∗) und d1 ≥ di folgt, dass die letzte Klammer nichtnegativ ist, also∑i λ′′i ci ≥
∑i λ′ici gilt. (Sogar Gleichheit.)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 24
Wissen nun: 1 = λ1 = λ′1.
Wir wenden die Induktionsvoraussetzung auf den modifizierten Inputx− = (a2, . . . , an, c2, . . . , cn, b − a1) an.
GFKS lauft in Schleifendurchlaufen 2 bis n ebenso wie GFKS auf x−,liefert also fur x− eine optimale Losung: (λ2, . . . , λn).
Klar: (λ′2, . . . , λ′n) muss fur x− optimal sein.
(Wenn (λ′′2 , . . . , λ′′n ) besser ware, dann ware (1, λ′′2 , . . . , λ
′′n ) eine bessere Losung
fur x als (1, λ′2, . . . , λ′n). Das kann nicht sein.)
Nach I.V. gilt∑
2≤i≤n λici =∑
2≤i≤n λ′ici .
Also haben auch die Losungen (1, λ′2, . . . , λ′n) und (1, λ2, . . . , λn) fur x
denselben Nutzenwert. �
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 25
An den Beispielen zu beobachtende Charakteristika der Greedy-Methode:
1 Der erste Schritt der Greedy-Losung ist nicht falsch. Es gibt eineoptimale Losung, die als Fortsetzung des ersten Schritteskonstruiert werden kann.
2
”Prinzip der optimalen Substruktur“: Entfernt man aus einer
optimalen Losung die erste(n) Komponente(n), so bleibt als Rest dieoptimale Losung fur einen Teil oder Rest des Inputs.
3 Der Korrektheitsbeweis wird mit vollstandiger Induktion gefuhrt.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 26
3.2 Huffman-Codes
Gegeben: Alphabet Σ und”Wahrscheinlichkeiten“
p(a) ∈ [0, 1] fur jeden Buchstaben a ∈ Σ. Also:∑a∈Σ
p(a) = 1.
Beispiel:
a A B C D E F G H I Kp(a) 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09
Herkunft der Wahrscheinlichkeiten:(1) Buchstabenhaufigkeit in naturlicher Sprache oder(2) empirische relative Haufigkeiten in einemgegebenen Text w = a1 . . . an:Anteil des Buchstabens a an w ist (p(a) · 100)%.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 27
Gesucht: ein”
guter“ binarer Prafixcode fur (Σ, p).
Definition 3.2.1
Prafixcode:Jedem a ∈ Σ ist binarer
”Code“ c(a) ∈ {0, 1}+ zugeordnet,
mit Eigenschaft Prafixfreiheit:Fur a, b ∈ Σ, a 6= b ist c(a) kein Prafix von c(b).
Beispiel:
A B C D E F G H I K
1100 0110 000 111 10 0011 010 0010 0111 1101
Codierung von Wortern (Zeichenreihen):
c(a1 . . . an) = c(a1) · · · c(an) ∈ {0, 1}∗.Zur Codierung benutzt man (konzeptuell) direkt die Tabelle.
Beispiel: c(F E I G E ) = 0011 10 0111 010 10.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 28
Kompakte Reprasentation des Codes als Binarbaum:
A K
D
B
G
I
C
H F
0
0
0
0
0
0 0
0
0
1
1
1
11
1
1
1
1
E
Blatter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibtdas Codewort wieder (links: 0, rechts: 1).
Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zumBlatt. Wiederhole mit dem Restwort, bis nichts mehr ubrig ist. –Prafixeigenschaft ⇒ keine Zwischenraume notig.
Beispiel: 001111000000010 liefert”FACH“.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 29
1. Idee: Mache alle Codeworter c(a) gleich lang;am besten ist dann eine Lange von dlog2 |Σ|e Bits.
⇒ c(a1 . . . an) hat Lange dlog2 |Σ|e · n.
(Beispiele: 52 Groß- und Kleinbuchstaben plus Leerzeichen und Satzzeichen:log 64 = 6 Bits pro Codewort. ASCII-Code: 8 Bits pro Codewort.)
2. Idee: Einsparmoglichkeit: Haufige Buchstaben mit kurzeren Codescodieren als seltenere Buchstaben.
Ein erster Ansatz zur Datenkompression(platzsparendes Speichern, zeitsparendes Ubermitteln)!
Hier:”
verlustfreie Kompression“ – die Information ist unverandertvorhanden.
Gegensatz: MP3: Informationsverlust bei der Kompression.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 30
A B C D E F G H I Kp(a) 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09c1 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001c2 1100 0110 000 111 10 0011 010 0010 0111 1101
Wir codieren eine Datei T mit 100000 Buchstaben aus Σ, wobei dierelative Haufigkeit von a ∈ Σ durch p(a) gegeben ist.
Mit c1 (fixe Codewortlange): 400000 Bits.Mit c2 (variable Codewortlange):(4 · (0, 15 + 0,08 + 0,08 + 0,09 + 0,06 + 0,09) + 3 · (0,07 + 0,10 + 0,07) +2 · 0,21) · 100000 = 334000 Bits.
Bei langen Dateien und wenn die Ubertragung teuer oder langsam ist, lohnt es
sich, die Buchstaben abzuzahlen, die relativen Haufigkeiten p(a) zu bestimmen
und einen guten Code mit unterschiedlichen Codewortlangen zu suchen.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 31
Definition 3.2.2
Ein Codierungsbaum fur Σ ist ein Binarbaum T , in dem
die Kante in einem inneren Knoten zum linken bzw. rechten Kind(implizit) mit 0 bzw. 1 markiert ist;jedem Buchstaben a ∈ Σ ein Blatt (externer Knoten) von T exklusivzugeordnet ist.
cT (a) ist die Kanteninschrift auf dem Weg von der Wurzel zum Blatt mitInschrift a.Die Kosten von T unter p sind definiert als:
B(T,p) =∑a∈Σ
p(a) · dT (a),
wobei dT (a) die Tiefe des a-Blatts in T ist.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 32
Beispiel: Wenn T unser Beispielbaum ist und p die Beispielverteilung vonoben, dann ist B(T , p) = 3,34.
A K
D
B
G
I
C
H F
0
0
0
0
0
0 0
0
0
1
1
1
11
1
1
1
1
E
Leicht zu sehen: B(T , p) = |cT (a1 . . . an)|/n, wenn die relative Haufigkeit von a inw = a1 . . . an durch p(a) gegeben ist,
oder B(T , p) = die erwartete Bitzahl pro Buchstabe, wenn dieBuchstabenwahrscheinlichkeiten durch p(a), a ∈ Σ, gegeben sind.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 33
Definition 3.2.3
Ein Codierungsbaum T fur Σ heißt optimal oderredundanzminimal fur p, wenn B(T , p) ≤ B(T ′, p)fur alle Codierungsbaume T ′ fur Σ.
Aufgabe: Zu gegebenem p : Σ→ [0, 1] finde einen optimalen Baum T .
Existiert immer ein optimaler Baum?
(Zu Σ gibt es unendlich viele Codierungsbaume!)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 34
Lemma 3.2.4
Wenn T Codierungsbaum und p Verteilung fur Σ ist, dann gibt es einenCodierungsbaum T ′ mit B(T ′, p) ≤ B(T , p), so dass in T ′ jeder innereKnoten zwei Kinder hat.
Beweisidee:
T: T’:w
x v
u
w
x u
1
0
1
Umbau:
fehltTx
Tu
Tx TuÜberspringe v
Resultat: T ′ fur Σ mit denselben markierten Blattern wie T , undB(T ′, p) ≤ B(T , p).
Folgerung: Man kann sich bei der Suche nach optimalen Baumen auf solchebeschranken, in denen jeder innere Knoten zwei Kinder hat.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 35
Weil es fur festes Σ nur endlich viele Σ-Codierungsbaume T gibt, in denenjeder innere Knoten zwei Kinder hat, gibt es fur (Σ, p) optimaleCodierungsbaume.
Optimale Baume sind i. A. nicht eindeutig.
Aufgabe: Gegeben (Σ, p), finde einen optimalen Baum.
Methode:”
Greedy“.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 36
Lemma 3.2.5
Es seien a, a′ zwei Buchstaben mit p(a), p(a′) ≤ p(b) fur alleb ∈ Σ− {a, a′}. (a, a′ sind zwei
”seltenste“ Buchstaben.)
Dann gibt es einen optimalen Baum, in dem die a- und a′-Blatter Kinderdesselben inneren Knotens sind.
Beweis:
Starte mit beliebigem optimalen Baum T .
O.B.d.A. (Le. 3.2.4): Alle inneren Knoten haben zwei Kinder.
a und a′ sitzen in Blattern von T , Tiefen dT (a) und dT (a′).
O.B.d.A.: (∗) dT (a) ≥ dT (a′) (sonst umbenennen).
Der a-Knoten hat einen Geschwisterknoten v(innerer Knoten oder Blatt).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 37
a’
T :v
T:
a v
1. Fall: Der a′-Knoten liegt im Unterbaum Tv mit Wurzel v .Wegen (∗) muss er gleich v sein, und a-Knoten und a′-Knoten sindGeschwisterknoten in T .
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 38
vT :
T:
a
a’
v
2. Fall: Der a′-Knoten liegt nicht in Tv .Weil Tv mindestens ein Blatt hat und p(b) ≥ p(a′) fur alle b ∈ Σ− {a, a′}gilt, haben wir ∑
b in Tv
p(b) ≥ p(a′).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 39
T :v
T :v
T’:T:
a
a’
a a’v
v
Vertauschen von Blatt a′ und Tv liefert Baum T ′, in dem a und a′
Geschwister sind, mit:
B(T ′, p)− B(T , p) = (dT (a)− dT (a′)) · (p(a′)−∑
b in Tv
p(b)) ≤ 0.
Das heißt: auch T ′ ist ein optimaler Baum fur (Σ, p). �
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 40
Damit ist der erste Schritt zur Realisierung eines Greedy-Ansatzes getan!
Man beginnt den Algorithmus mit
”Mache die beiden seltensten Buchstaben zu Geschwistern“.
Dann ist man sicher, dass dies stets zu einer optimalen Losung ausgebautwerden kann.
Diese optimale Losung findet man rekursiv (konzeptuell) bzw. dann in derRealisierung iterativ.
Algorithmus stammt von D. A. Huffman (1925–1999), am. Informatiker.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 41
Huffman-Algorithmus (rekursiv):
Wir bauen”
bottom-up“ einen Baum auf.
Wenn |Σ| = 1: fertig, man benotigt nur einen Knoten, der auch Blatt ist.Optimalitat: Klar.
Sonst werden zwei”seltenste“ Buchstaben a, a′ aus Σ zu benachbarten
Blattern gemacht.
0 1
a a’
ppa a’
b
p pa a’+
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 42
Die Wurzel des so erzeugten Mini-Baums wird als ein”Kunstbuchstabe“ b
aufgefasst mit p(b) = p(a) + p(a′).
Neues Alphabet: Σ′ := (Σ− {a, a′}) ∪ {b}; neue Verteilung:
p′(d) :=
{p(d) falls d 6= bp(a) + p(a′) falls d = b
Nun bauen wir durch rekursive Verwendung des Algorithmus einen BaumT ′ fur Σ′ und p′.
In T ′ fugen wir an der Stelle des b-Knotens den a, a′-Baum ein.
Ergebnis: Ein Codierungsbaum T fur Σ,mit B(T , p) = B(T ′, p) + (p(a) + p(a′)). (Checken!)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 43
Lemma 3.2.6
T ist optimaler Baum fur (Σ, p).
Beweis: Durch Induktion uber die rekursiven Aufrufe.
Nach Lemma 3.2.5. gibt es einen optimalen Baum T1 fur (Σ, p), in dema- und a′-Knoten Geschwister sind.
Aus T1 bilden wir T ′1 durch Ersetzen des a, a′-Teilbaums durch denKunstknoten b. Dann ist T ′1 Codierungsbaum fur Σ′.
Nach I.V. fur den rekursiven Aufruf ist T ′ optimal fur (Σ′, p′), alsoB(T ′, p′) ≤ B(T ′1, p
′). Daher:
B(T , p) = B(T ′, p′) + p(a) + p(a′)≤B(T ′1, p′) + p(a) + p(a′) = B(T1, p).
Weil T1 optimaler Baum fur (Σ, p) ist:B(T , p) = B(T1, p), und auch T ist optimal. �
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 44
Noch nachzutragen:
Implementierungsdetails.
Laufzeitanalyse.
Vergleich von B(T , p) fur optimale Baume mit der Entropie H((pa)a∈Σ).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 45
Man konnte nach dem angegebenen Muster eine rekursive Prozedurprogrammieren.
PQ: Datenstruktur Priority Queue,Eintrage: Buchstaben und Kunstbuchstaben;Schlussel: die Gewichte p(b), b (Kunst-)Buchstabe.
Operationen: PQ.insert: Einfugen eines neuen Eintrags;PQ.extractMin: Entnehmen des Eintrags mit kleinstem Schlussel.
Beide Operationen benotigen logarithmische Zeit (siehe 3.3).
Anfangs in PQ: Buchstaben a ∈ Σ mit Gewichten p(a) als Schlussel.Ermitteln und Entfernen der beiden
”leichtesten“ Buchstaben a, a′ durch
zwei Aufrufe PQ.extractMin;Einfugen des neuen Kunstbuchstabens b durch PQ.insert(b).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 46
Iterative Implementierung wird effizienter.
Eine spezielle Reprasentation des Baums (nur Vorganger-Zeiger, die durch Indizesdargestellt werden) ermoglicht es, ganz ohne Zeiger auszukommen.
Datenstruktur:Arrays p, pred, mark mit Indizes 1..2m − 1, m = |Σ|.Dabei reprasentieren
die Positionen 1, . . . ,m die Buchstaben a1, . . . , am in Σ, also dieBlatter des Baumes,die Positionen m + 1, . . . , 2m − 1 die m − 1
”Kunstbuchstaben“, also
die inneren Knoten des Baums.
Fur den Algorithmus tut man so, als ob 1, . . . ,m die Buchstaben und m +1, . . . , 2m − 1 die
”Kunstbuchstaben“ waren.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 47
p[1..2m − 1] ist ein Array, das in den Positionen 1, . . . ,m die Gewichtep1, . . . , pm enthalt.
Positionen p[m + 1..2m − 1]: Gewichte der m − 1”Kunstbuchstaben“.
Das Array pred[1..2m − 1] speichert die Vorganger der Knoten imBaum(Knoten 2m − 1 ist die Wurzel und hat keinen Vorganger).
In Bitarray mark[1..2m − 1] fuhrt man mit, ob ein Knoten linkes (”0“)
oder rechtes (”1“) Kind ist.
PQ: Priority Queue, Eintrage: a ∈ {1, . . . , 2m − 1};Schlussel: die Gewichte p[a].
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 48
Algorithmus Huffman(p[1..m])Eingabe: Gewichtsvektor p[1..m]
Ausgabe: Implizite Darstellung eines Huffman-Baums(1) for a from 1 to m do(2) PQ.insert(a); (∗ Buchstabe a hat Prioritat p[a] ∗)(3) for b from m + 1 to 2m − 1 do(4) a ← PQ.extractMin;(5) aa ← PQ.extractMin;(6) pred[a] ← b;(7) mark[a] ← 0;(8) pred[aa] ← b;(9) mark[aa] ← 1;(10) p[b] ← p[a] + p[aa];(11) PQ.insert(b);(12) Ausgabe: pred[1..2m − 1] und mark[1..2m − 1].
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 49
Aus pred[1..2m − 1] und mark[1..2m − 1] baut man denHuffman-Baum wie folgt:
Allokiere ein Array leaf[1..m] mit Blattknoten-Objektenund ein Array inner[m + 1..2m − 1] mit Objekten fur innere Knoten.
(1) for i from 1 to m do(2) leaf[i].letter ← Buchstabe ai.(3) if mark[i] = 0(4) then inner[pred[i]].left ← leaf[i]
(5) else inner[pred[i]].right ← leaf[i]
(6) for i from m + 1 to 2m − 2 do(7) if mark[i] = 0(8) then inner[pred[i]].left ← inner[i]
(9) else inner[pred[i]].right ← inner[i]
(10) return inner[2m − 1] (∗ Wurzelknoten ∗)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 50
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred
mark
i 11 12 13 14 15 16 17 18 19
pipred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 11 11mark 0 1
i 11 12 13 14 15 16 17 18 19
pi 0,13pred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 11 11mark 0 1
i 11 12 13 14 15 16 17 18 19
pi 0,13pred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 12 12 11 11mark 0 1 0 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15pred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 12 12 11 11mark 0 1 0 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15pred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 13 12 12 11 11 13mark 0 0 1 0 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17pred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 13 12 12 11 11 13mark 0 0 1 0 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17pred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 13 12 14 12 11 14 11 13mark 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19pred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 13 12 14 12 11 14 11 13mark 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19pred
mark
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 12 11 14 11 13mark 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28pred 15mark 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 12 11 14 11 13mark 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28pred 15mark 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 12 11 14 11 13mark 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28 0,32pred 15 16 16mark 1 0 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 12 11 14 11 13mark 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28 0,32pred 15 16 16mark 1 0 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 17 12 11 14 11 13mark 0 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28 0,32 0,40pred 15 16 16 17mark 1 0 1 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 17 12 11 14 11 13mark 0 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28 0,32 0,40pred 15 16 16 17mark 1 0 1 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 17 12 11 14 11 13mark 0 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28 0,32 0,40 0,60pred 15 16 16 17 18 18mark 1 0 1 1 0 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 17 12 11 14 11 13mark 0 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28 0,32 0,40 0,60pred 15 16 16 17 18 18mark 1 0 1 1 0 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 17 12 11 14 11 13mark 0 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28 0,32 0,40 0,60 1,00pred 15 16 16 17 18 18 19 19mark 1 0 1 1 0 1 0 1
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
ai A B C D E F G H I Ki 1 2 3 4 5 6 7 8 9 10
pi 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09pred 15 13 12 14 17 12 11 14 11 13mark 0 0 0 0 0 1 0 1 1 1
i 11 12 13 14 15 16 17 18 19
pi 0,13 0,15 0,17 0,19 0,28 0,32 0,40 0,60 1,00pred 15 16 16 17 18 18 19 19 –mark 1 0 1 1 0 1 0 1 –
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51
Resultierender optimaler Codierungsbaum T :
1 1 1
1
1
1
11
1
0
19
17 18
14 15 16
11 12 13
5
4 8 1
7 9 3 6 2 10
0
0 0
0
0 0
0
0
E
D A
G I F B KC
H
A B C D E F G H I Kp(a) 0,15 0,08 0,07 0,10 0,21 0,08 0,07 0,09 0,06 0,09c3 100 1110 1100 010 00 1101 1010 011 1011 1111
B(T , p) = 0,21 · 2 + (0,1 + 0,09 + 0,15) · 3 + 0,45 · 4 = 3,24.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 52
Satz 3.2.7
Der Algorithmus Huffman ist korrekt und hat Laufzeit O(m logm), wennm die Anzahl der Buchstaben des Alphabets Σ bezeichnet.
Beweis: Laufzeit: Aufbau der Priority Queue dauert O(m logm); mit Trickskonnte man auch mit Zeit O(m) auskommen.
Die Schleife wird (m − 1)-mal durchlaufen. In jedem Durchlauf gibt esmaximal 3 PQ-Operationen, mit Kosten O(logm).
Korrektheit: Folgt aus der Korrektheit der rekursiven Version.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 53
Kann man B(T , p) fur einen optimalen Baum einfach aus denHaufigkeiten p(a1), . . . , p(am) berechnen, ohne T zu konstruieren?
Antwort: Ja, zumindest naherungsweise.
Definition
Sind p1, . . . , pm ≥ 0 mit∑m
i=1 pi = 1, setzt man
H(p1, . . . ,pm) :=m∑i=1
pi · log(1/pi ).
H(p1, . . . , pm) heißt die Entropie der Verteilung p1, . . . , pm.
(Wenn pi = 0 ist, setzt man pi log(1/pi ) = 0, was vernunftig ist, weillimx↘0 x · log(1/x) = 0.)
Bsp.: H( 12 ,
14 ,
14 ) = 1
2 · 1 + 2 · 14 · 2 = 3
2 .
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 54
Interessant: Zusammenhang zwischen Entropie H(p1, . . . , pm) und dererwarteten Bitlange eines Textes, in dem m = |Σ| Buchstaben mitWahrscheinlichkeiten p1, . . . , pm auftreten.
Klassisches Resultat:
Lemma 3.2.8 (Lemma von Gibb)
Sind q1, . . . , qm > 0 mit∑m
i=1 qi ≤ 1 =∑m
i=1 pi , so gilt
m∑i=1
pi log(1/qi ) ≥m∑i=1
pi log(1/pi ) = H(p1, . . . , pm).
(Voraussetzung kann zu pi > 0⇒ qi > 0 abgeschwacht werden.)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 55
Beweis:
Weil log2 x = ln x/ ln 2 ist, darf man mit dem naturlichen Logarithmusrechnen.
m∑i=1
pi ln
(1
pi
)−
m∑i=1
pi ln
(1
qi
)
=m∑i=1
pi ln
(qipi
)(∗)≤
m∑i=1
pi
(qipi− 1
)
=m∑i=1
(qi − pi ) =m∑i=1
qi −m∑i=1
pi ≤ 0.
(∗): Es gilt ln(x) ≤ x − 1, fur alle x ∈ R. (Summanden fur i mit pi = qi = 0
lasst man einfach weg.)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 56
Satz 3.2.9 (Ungleichung von Kraft/McMillan)
Es seien m ≥ 1, l1, . . . , lm ∈ N. Dann gilt: Es gibt einen Prafixcode mitCodewortlangen l1, . . . , lm genau dann wenn
m∑i=1
2−li ≤ 1.
”⇒“: Nach den Bemerkungen am Anfang von Abschnitt 3.2 kann man
statt”Existenz eines Prafixcodes“ auch
”Existenz eines Binarbaums mit
Blattern auf Tiefe l1, . . . , lm“ sagen.
http://www.tu-ilmenau.de/iti/lehre/lehre-ss-2011/
algorithmen-und-datenstrukturen/
AuD-Vorlesung 2011, 3. Kapitel, Lemma 3.3.4, Folie 44.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 57
”⇐“: Nun seien l1, . . . , lm ≥ 0 gegeben, mit
∑mi=1 2−li ≤ 1. Wir benutzen
Induktion uber m ≥ 1(aquivalent: einen rekursiven Algorithmus),um die behauptete Existenz eines passenden prafixfreien Codes zu zeigen.
m = 1: Wahle ein beliebiges Codewort x1 aus {0, 1}l1 .(Achtung: Wenn l1 = 0, ist x1 = ε, das leere Wort. Dies entspricht einemCodierungsbaum, der nur aus der Wurzel besteht.)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 58
Nun sei m ≥ 2. Wir ordnen (o.B.d.A.) die l1, . . . , lm so an, dassl1 ≥ l2 ≥ · · · ≥ lm gilt. Nach Vor.:
∑mi=2 2l1−li < 2l1 ;
die Summe ist durch 2l1−l2 teilbar.
Also:∑m
i=2 2l1−li ≤ 2l1 − 2l1−l2 .
Daraus: 2 · 2l1−l2 +∑m
i=3 2l1−li ≤ 2l1 , d. h.
2−(l2−1) +∑m
i=3 2−li ≤ 1.
Setze l ′1 := l2 − 1 und finde (nach Induktionsvoraussetzung bzw. rekursiv)einen Prafixcode {x ′1, x3, x4, . . . , xm} fur l ′1, l3, . . . , lm. Nun bilde x2 := x ′11und x1 := x ′10 . . . 0 (mit l1 − l2 + 1 angehangten Nullen). Es ist leicht zusehen, dass auch {x1, . . . , xm} prafixfrei ist.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 59
Beispiel:
(l1, . . . , l6) = (1, 4, 5, 3, 6, 3); sortiert: (6, 5, 4, 3, 3, 1).
Dies fuhrt zu rekursiven Aufrufen fur:
1) (4, 4, 3, 3, 1)
2) (3, 3, 3, 1)
3) (2, 3, 1), sortiert: (3, 2, 1)
4) (1, 1)
5) (0).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 60
Die Prafixcodes fur diese Aufrufe:
5) {ε}4) {0, 1}3) {000, 01, 1}, also {01, 000, 1}2) {010, 011, 000, 1}1) {0100, 0101, 011, 000, 1}
Gesamtlosung: {010000, 01001, 0101, 011, 000, 1}
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 61
Satz 3.2.10 (Huffman versus Entropie)
Ist p : Σ→ [0, 1] mit∑
a∈Σ p(a) = 1 gegeben, so gilt fur einen optimalenCodierungsbaum T zu (Σ, p):
H(p1, . . . , pm) ≤ B(T , p) ≤ H(p1, . . . , pm) + 1.
(Informal: Setze pi = p(ai ), fur Σ = {a1, . . . , am}.Die erwartete Zahl von Bits, die man braucht, um einen Text t1 . . . tN uberΣ zu codieren, liegt zwischen N · H(p1, . . . , pm) undN · (H(p1, . . . , pm) + 1).)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 62
Beweis: 1. Ungleichung: Es seien l1, . . . , lm die Tiefen der Blatter in T zuden Buchstaben a1, . . . , am. Dann gilt
∑mi=1 2−li ≤ 1 nach Satz 3.2.9.
Damit konnen wir Lemma 3.2.8 mit qi = 2−li anwenden und erhalten
B(T , p) =m∑i=1
pi · li =m∑i=1
pi · log(1/2−li ) ≥ H(p1, . . . , pm).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 63
Fur die 2. Ungleichung genugt es zu zeigen, dass ein Codierungsbaum T ′
fur a1, . . . , am existiert, in dem B(T ′, p) ≤ H(p1, . . . , pm) + 1 gilt.
(Der optimale Baum T erfullt ja B(T , p) ≤ B(T ′, p).)
Wir setzen li := dlog(1/pi )e, fur 1 ≤ i ≤ m, und beobachten:
m∑i=1
2−li =m∑i=1
2−dlog(1/pi )e ≤m∑i=1
2− log(1/pi )
=m∑i=1
pi = 1.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 64
Nach Satz 3.2.9 existiert also ein Prafixcode mit Codewortlangen(l1, . . . , lm); im entsprechenden Codierungsbaum T ′ ordnen wir dem Blattauf Tiefe li den Buchstaben ai zu. Dann ist
B(T ′, p) =m∑i=1
pi · li ≤m∑i=1
pi · (log(1/pi ) + 1)
= H(p1, . . . , pm) +m∑i=1
pi
= H(p1, . . . , pm) + 1.
Bemerkung: Es gibt bessere Kodierungsverfahren als das von Huffman(z.B.
”arithmetische Kodierung“; diese vermeiden den Verlust von bis zu
einem Bit pro Buchstabe), aber Huffman-Kodierung ist ein guter Anfang. . .
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 65
3.3 (Hilfs-)Datenstruktur Priority Queues(oder: Vorrangswarteschlangen)
Datensatze mit Schlussel aus sortiertem Universum (U, <) werdeneingefugt und entnommen.
Beim Entnehmen wird immer der Eintrag mit dem kleinsten Schlusselgewahlt. Schlussel =
”Prioritaten“.
Beim Huffman-Algorithmus: Datensatze sind(Kunst-)Buchstaben, Prioritaten/Schlussel sind die Gewichte.
Vorlesung”Algorithmen und Datenstrukturen“:
Spezifikation und Realisierung mit Binarheaps.
http://www.tu-ilmenau.de/iti/lehre/lehre-ss-2011/
algorithmen-und-datenstrukturen/, Kapitel 6.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 66
Operationen:
empty – leere PQ anlegen.
isempty – PQ auf Leerheit prufen.
insert – neues Element einfugen.
extractMin – ein Element mit kleinster Prioritat loschen.
decreaseKey – die Prioritat eines Elements in der PQ senken.
Wir nutzen zur Implementierung von Prioritatswarteschlangen Binarheaps.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 67
Ein linksvollstandiger Binarbaum:
Alle Levels j = 0, 1, . . . voll (jeweils 2j Knoten) bis auf das tiefste.Das tiefste Level l hat von links her gesehen eine ununterbrochene Folgevon Knoten.Konnen gut als Arrays dargestellt werden!
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 68
Nummerierung von Knoten in unendlichem, vollstandigen Binarbaum inLevelorder:
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
2
1
54
8 9 10 11
3
6
12 13
7
14 15
474632 63
0
0
0
0
00 0
0
0
0
0
0
00 0
1
1
1
1
11
11
1
1
11
0 1
1
10
1
Zeiger zum linken bzw. rechten Kind mit 0 bzw. 1 markiert.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 69
Knoten 1 ist die Wurzel;Knoten 2i ist linkes Kind von i ;Knoten 2i + 1 ist rechtes Kind von i ;Knoten i ≥ 2 hat Vater bi/2c.Damit: Array-Darstellung fur linksvollstandige Binarbaume:Speichere Eintrage in Knoten 1, . . . , n in Array A[1 . . n].Spart den Platz fur die Zeiger!
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 70
Definition 3.3.1
Sei (U, <) Totalordnung.Ein (Teil-)Array A[1 . . k] ist ein Heap, falls fur 1 ≤ i ≤ k gilt:2i ≤ k ⇒ A[i].key ≤ A[2i].key und2i + 1 ≤ k ⇒ A[i].key ≤ A[2i + 1].key.
Aufgrund besserer Darstellbarkeit betrachten wir im weiteren Verlauf dieBaumdarstellung.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 71
B
FE
H FE
P N
G
N
NB: T heapgeordnet ⇒ in Knoten v steht der minimale Eintrag desTeilbaums Tv mit Wurzel v .
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 72
Beispiel: U = {A, B, C, . . . ,Z} mit der Standardordnung.
Im Beispiel: Daten weggelassen.
Ein Min-Heap und der zugeordnete Baum (k = 10):
121198 107654321
* *1
2 3
4 5 7
8 9 10
G F
H I
B
E F
G
E H
B E F G E H F H I G
6
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 73
Implementierung einer Priority Queue: Neben Array A[1 . .m]:
Pegel k: Aktuelle Zahl k von Eintragen.
(Uberlaufprobleme werden ausgeklammert. Verdoppelungsstrategie, falls notig.)
empty(m):Lege Array A[1 . .m] an;(∗ Jeder Eintrag ist ein Paar (key, data). ∗)k ← 0.
(∗ Zeitaufwand: O(1) oder O(m) ∗)
isempty():return(k = 0);
(∗ Zeitaufwand: O(1) ∗)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 74
extractMin: Implementierung von extractMin(P):
Ein Eintrag mit minimalem Schlussel steht in der Wurzel, d. h. inArrayposition 1.
Entnehme A[1] (hier”B“) und gib es aus.
121198 107654321
* *1
2 3
4 5 7
8 9 10
G F
H I
B
E F
G
E H
B E F G E H F H I G
6
”Loch“ im Binarbaum. –
”stopfen“ mit dem letzten Eintrag.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 75
extractMin: Implementierung von extractMin(P):
Ein Eintrag mit minimalem Schlussel steht in der Wurzel, d. h. inArrayposition 1.
Entnehme A[1] (hier”B“) und gib es aus.
1198 10765 124321
**
*
1
2
4 5 6 7
8 9 10
G F
H I
E F
E H
E F G E H F H I
3
G
G *
”Loch“ im Binarbaum. –
”stopfen“ mit dem letzten Eintrag.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 75
Heaps reparieren
*
<
<
8 9 11
*
6 10
*
543 71 122
E
E
E
E
G
G
FG
98
H
764
32
H
1
I
F
F
H F H IG
5
Vergleich der beiden Kinder des aktuellen Knotens.Vergleich des
”kleineren“ Kinds mit dem aktuellen Knoten.
Vertauschen des”kleineren“ Kinds (E) mit dem aktuellen Knoten (G).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 76
Heaps reparierenErgibt Abwarts-Fast-Heap, aktueller Knoten ein Level tiefer.
*
>
>
8 9 11
*
6 10
*
543 71 122
E
E
G
G
E
E
FG
98
H
764
32
H
1
I
F
F
H F H IG
5
Vergleich der beiden Kinder des aktuellen Knotens.Vergleich des
”kleineren“ Kinds mit dem aktuellen Knoten.
Vertauschen des”kleineren“ Kinds (E) mit dem aktuellen Knoten (G).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 76
Heaps reparierenErgibt Abwarts-Fast-Heap, aktueller Knoten ein Level tiefer.
*
8 9 11
*
6 10
*
543 71 122
E
E G
G
E
E
FG
98
H
764
32
H
1
I
F
F
H F H IG
5
Aktueller Knoten hat keine Kinder.Kein Fehler mehr: Reparatur beendet.Andere Moglichkeit fur Ende: Eintrag im aktuellen Knoten ist nicht großerals der im
”kleineren Kind“.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 76
Erinnerung: Wenn A ein Abwarts-Fast-Heap bzgl. Stelle k ist, dann gibt eseinen Schlussel z ≤ A[k].key, so dass ein Heap entsteht, wenn manA[k].key durch z ersetzt.
Lemma 3.3.2
Sei A ein Abwarts-Fast-Heap bzgl. Stelle k .
1 Falls A[k] maximal so groß wie jeder seiner Kindschlussel ist (soferndiese existieren), dann ist A ein Heap.
2 Sei A[m] das kleinste Kind von A[k] und A[k] > A[m]. NachVertauschen von A[k] und A[m] ist A ein Abwarts-Fast-Heap bzgl.Stelle m.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 77
Beweis von Lemma 3.3.2. Fur die nachstehenden Uberlegungen istfolgendes Bild nutzlich, welches die Beziehungen zwischen den Prioritatenverdeutlicht, die aus der Eigenschaft
”Abwarts-Fast-Heap an Stelle k“
folgen:
y
x
c1 c2
y ≤ z
z ≤ x
c1 ≥ z c2 ≥ z
bk/2c
k
O.B.d.A. nehmen wir an, dass m = 2k . Das linke Kind (c1) ist also daskleinere Kind. (Sonst: Umbenennen!)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 77
1. Fall: Es gilt c1 ≥ x und c2 ≥ x . Des Weiteren gilt (immer) y ≤ x . WennA mit A[k]← z ein Heap ist, dann auch mit A[k] = x .
2. Fall: Wir vertauschen in 2 Schritten:
1 Setze A[k]← c1. Da y ≤ z und z ≤ c1, ist also y ≤ c1. Damit ist A,unter der Voraussetzung dass A ein Abwarts-Fast-Heap bzgl. Stelle kist, ein Heap.
2 Setze A[m]← x . Damit wird A ein Abwarts-Fast-Heap bezuglichStelle m.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 77
bubbleDown(1, k) (∗ Heap-Reparatur in A[1 . . k] ∗)(∗ Muss wissen: A[1 . . k] ist Abwarts-Fast-Heap bzgl. Position 1 ∗)
(1) j ← 1; m ← 2; done ← false;(2) while not done and m + 1 ≤ k do
(∗ Abwarts-Fast-Heap bzgl. Position j, A[j] hat 2 Kinder ∗)(3) if A[m+1].key < A[m].key
(4) then (∗ A[m]:”kleineres“ Kind ∗)
(5) m ← m + 1;(6) if A[m].key < A[j].key
(7) then vertausche A[m] mit A[j]; j ← m; m ← 2 ∗ j;(8) (∗ nun wieder: Abwarts-Fast-Heap bzgl. j ∗)(9) else (∗ fertig, kein Fehler mehr ∗)(10) done ← true;(11) if not done then(12) if m ≤ k then (∗ Abwarts-Fast-Heap bzgl. j, ein Kind in A[m] ∗)(13) if A[m].key < A[j].key
(14) then vertausche A[m] mit A[j];
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 78
Korrektheit: Folgt unmittelbar aus den Uberlegungen aus Lemma 3.3.2.
Kosten:
Im Binarbaum gibt es maximal dlog(k + 1)e Levels; fur jedes Levelmaximal einen Schleifendurchlauf.
Also Kosten: O(log k).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 79
extractMin(∗ Entnehmen eines minimalen Eintrags aus Priority-Queue ∗)(∗ Ausgangspunkt: Pegel k, A[1 . . k] ist Heap, k ≥ 1 ∗)
(1) x← A[1].key; d← A[1].data;(2) A[1]← A[k];(3) k--;(4) if k > 1 then bubbleDown(1, k);(5) return (x, d);
Korrektheit: klar wegen Korrektheit von bubbleDown(1, k).
Zeitaufwand: O(log(k)).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 80
Implementierung von insert(x , d):
Voraussetzung: A[1..k] ist Heap; 1 ≤ i ≤ k < m.
k++;A[k]← (x , d).
An der Stelle k ist nun eventuell die Heapeigenschaft gestort(x zu klein).
Wir nennen A[1..k] einen Aufwarts-Fast-Heap bzgl. k .
Heißt: Es gibt einen Schlussel z ≥ A[k].key, so dass ein Heap entsteht,wenn man A[k].key durch z ersetzt.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 81
Heap:
* *Q
Q
L
L
H
H
F
F
K
K
J
JG
GF
F
E
E
C
C
2 121198 10765431
1098
654
32
1
7
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 82
Einfugen von”D“ an Stelle k = 11.
11
*
D
DQ
Q
L
L
H
H
F
F
K
K
J
JG
GF
F
E
E
C
C
2 121198 10765431
1098
654
32
1
7
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 82
Heapreparatur mittels bubbleUp.
11
*D
D
Q
Q
L
L
H
H
F
F
K
KJ
JG
G
F
F
E
E
C
C
98 10 11 12654321 7
98 10
54
32
1
76
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 82
Heapreparatur mittels bubbleUp.
11
J
J
D
D *Q
Q
L
L
H
H
F
F
K
KG
GF
F
E
E
C
C
2 3 121198 1076541
1098
754
32
1
6
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 83
Heapreparatur mittels bubbleUp.
11
J
J
D
D *Q
Q
L
L
H
H
F
F
K
KG
GF
F
E
E
C
C
32 4 121198 107651
1098
754
32
1
6
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 82
Heapreparatur mittels bubbleUp.
11
E
E
D
D
J
J *Q
Q
L
L
H
H
F
F
K
K
G
G
F
F
C
C
98 10 11 12654321 7
98 10
654
32
1
7
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 82
Heapreparatur mittels bubbleUp.
11
E
E
D
D
J
J *Q
Q
L
L
H
H
F
F
K
K
G
G
F
F
C
C
98 10 11 12654321 7
98 10
54
32
1
76
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 82
Heapreparatur mittels bubbleUp.
11
E
E
D
D
J
J *Q
Q
L
L
H
H
F
F
K
K
G
G
F
F
C
C
98 10 11 12654321 7
98 10
54
32
1
76
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 82
Lemma 3.3.3
Sei A ein Aufwarts-Fast-Heap bzgl. j .
1. Falls j = 1 oder A[j] ≥ A[bj/2c] dann ist A ein Heap.
2. Sei j > 1 und A[j] < A[bj/2c]. Nach Vertauschen von A[j] undA[bj/2c] ist A ein Aufwarts-Fast-Heap bzgl. Stelle bj/2c.
Beweis:
1. Erinnerung: Wenn A Aufwarts-Fast-Heap an Stelle j ist, dann existiertSchlussel z ≥ A[j].key, so dass ein Heap entsteht, wenn manA[j].key durch z ersetzt.
Es folgt, dass Schlussel A[j].key maximal so groß ist wie dieKindschlussel. (Diese sind mindestens so groß wie z .) NachVoraussetzung ist er nicht kleiner als Vaterschlussel (falls existent),also ist A ein Heap.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 83
2. Wir betrachten das folgende Bild.
y
x
c1 c2
y ≤ z
x < y ≤ z
c1 ≥ z c2 ≥ z
bj/2c
j
Wir vertauschen in 2 Schritten:1 Uberschreibe A[j] mit y . Dies liefert nach Voraussetzung einen Heap.2 Uberschreibe A[bj/2c] mit x . Nun ist A ein Aufwarts-Fast-Heap bzgl.
Stelle bj/2c.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 84
Prozedur bubbleUp(i) (∗ Heapreparatur ab A[i] nach oben,Aufruf nur wenn A ein Aufwarts-Fast-Heap bzgl. Stelle i ist. ∗)
(1) j ← i ;(2) h ← j div 2;(3) while h ≥ 1 and A[h].key < A[j].key do(4) vertausche A[j] mit A[h];(5) j ← h;(6) h ← j div 2.
Klar: Wenn A Aufwarts-Fast-Heap bzgl. Stelle i ist, so ist A nach Aufrufvon bubbleUp(i) ein Heap. (Folgt unmittelbar aus den Uberlegungen vonLemma 3.3.3.)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 85
11
E
E
D
D
J
J *Q
Q
L
L
H
H
F
F
K
K
G
G
F
F
C
C
98 10 11 12654321 7
98
7
10
54
32
1
6
Anschaulich: Auf dem Weg von A[i] zur Wurzel werden alle Elemente,deren Schlussel großer als x (= der neue Eintrag in A[i]) ist, um einePosition (auf dem Weg) nach unten gezogen.
Eintrag A[i] landet in der freigewordenen Position.
Man kann dies auch effizienter (wie in StraigtInsertionSort) programmieren.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 86
Prozedur insert(x , d)(∗ Einfugen eines neuen Eintrags in Priority-Queue ∗)(∗ Ausgangspunkt: Pegel k, A[1 . . k] ist Heap, k < m ∗)
(1) if k = m then”Uberlauf-Fehler“;
(2) k++;(3) A[k]← (x , d);(4) bubbleUp(k).
Korrektheit: klar wegen Korrektheit von bubbleUp(k).
Zeitaufwand: O(log(k)).
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 87
Wir konnen bubbleUp(i) sogar fur eine etwas allgemeinere Operationverwenden (Korrektheitsbeweis gilt weiter):Wir ersetzen einen beliebigen Schlussel im Heap (Position i) durch einenkleineren. (Dadurch ist A ein Aufwarts-Fast-Heap bzgl. Stelle i .)
Wie zuvor: Mit bubbleUp(i) kann die Heapeigenschaft wieder hergestelltwerden.
Prozedur decreaseKey(x , i)(∗ (Erniedrigen des Schlussels an Arrayposition i auf x) ∗)
(1) if A[i].key < x then Fehlerbehandlung;(2) A[i].key ← x ;(3) bubbleUp(i).
(∗ Zeitaufwand: O(log(i)) ∗)
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 88
Satz 3.3.4
Der Datentyp “Priority Queue” kann mit Hilfe eines Heaps implementiertwerden.Dabei erfordern empty und isempty (und das Ermitteln des kleinstenEintrags) konstante Zeitund insert, extractMin und decreaseKey benotigen jeweils Zeit O(log n).
Dabei ist n jeweils der aktuelle Pegelstand, also die Anzahl der Eintrage inder Priority Queue.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 89
Technisches Problem:
Wie soll man der Datenstruktur”mitteilen“, welches Objekt gemeint
ist, wenn decreaseKey auf einen Eintrag angewendet werden soll?
Bei (binarem) Heap: Positionen der Eintrage im Array andern sich dieganze Zeit, durch die durch insert und extractMin verursachtenVerschiebungen im Array.
Technisch unsauber (widerspricht dem Prinzip der Kapselung einerDatenstruktur):dem Benutzer stets mitteilen, an welcher Stelle im Array ein Eintrag sitzt.
Wir werden einen Losungsansatz in einer Ubungsaufgabe besprechen.
FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 90
top related