(nach folien von prof. martin dietzfelbinger) · greedy -algorithmen sind anwendbar bei...

121
Effiziente Algorithmen Greedy-Algorithmen Vorlesender: Martin Aum¨ uller (nach Folien von Prof. Martin Dietzfelbinger) Mai 2012 FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 1

Upload: vandang

Post on 19-Jun-2019

220 views

Category:

Documents


1 download

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