15 Optimales Kodieren Es soll ein optimaler Kodierer C(T ) entworfen werden, welcher eine Information (z.b. Text T ) mit möglichst geringer Bitanzahl eindeutig überträgt. Die Anforderungen an den optimalen Kodierer C(T ) sind: sollte schnell kodieren sollte eindeutig dekodieren (präx-frei) minimale Kodelänge 15.1 Nötige Denitionen Als Beispiel soll der Text 'SUSANNE' kodiert werden. Folgende Denitionen werden benötigt: T = 'SUSANNE' ist der zu kodierende Text (im allg. eine Information, welche kodiert werden sollte) Z = {S, U, A, N, E} das Alphabet Z = 5 ist die Gröÿe des Alphabets f i ist die Auftrittsfrequenz. z.b.: f S = 2, f U = 1 p i ist die Auftrittswahrscheinlichkeit - z.b.: p S = 2 7, oder p U = 1 7 Die Entropie H(T ) (Pseudoeinheit 'bit') ist die eigentliche Information, die der Text T pro Zeichen enthält: Z H(T ) = p j log 2 p j Wenn man den Text 'SUSANNE' naiv kodiert, dann benötigt man 3 Bits pro Buchstabe. Für den ganzen Text benötigt man 3 7 = 21 Bits. Die Entropie (der eigentliche Informationsgehalt) beträgt aber nur 2.24 Bits pro Buchstabe, was auch die theoretische untere Grenze darstellt. j=1 1
Idee: Zeichen die häuger vorkommen, werden mit weniger Bits belegt. Ein Problem, dass dabei auftritt, ist das Präx-Problem. Damit der Kode eindeutig interpretierbar bleibt, darf kein Buchstabe kodiert ein Präx eines anderen Buchstaben sein. Zum Beispiel wenn C(x 1 ) = 10 für 'S' und C(x 2 ) = 100 für 'A' gegeben wäre, dann wäre das Kodestück...100... nicht eindeutig dekodierbar! 1 15.2 Darstellung des Kodierers Mit der Darstellung des Kodieres (und gleichzeitig des Dekodierers) als Binärbaum kann man Präxfreiheit garantieren. Die Datenstruktur hat dabei folgende Eigenschaften: Binärbaum (sog. Kodebaum) Werte sind blattorientiert (daher präxfrei) Die Wortlänge entspricht der Astlänge l i Wir suchen jenen Codebaum, der die Codelänge L(C) = n f il i minimiert. 15.3 Eigenschaften von optimalen Codebäumen Bevor wir einen Algorithmus zur Erzeugung eines optimalen Codebaums angeben, betrachten wir zunächst einige Eigenschaften eines optimalen Codebaums. 1. Der optimale Codebaum ist ein voller Binärbaum (d.h., jeder Knoten ist ein Blatt oder hat genau 2 Söhne). Beweis: Sei C ein Codebaum, der einen inneren Knoten k mit Grad 1 besitzt. Dann kann man daraus durch Löschen von k einen Baum C mit einer kleineren Codelänge erzeugen: L(C ) = L(C) f i 1 L(C ) < L(C) i T (k) } {{ } >0 T (k) ist dabei die Menge aller zu codierenden Zeichen (Blätter) unterhalb von k. Durch Löschen des Knotens k (Anhängen des einzigen Unterbaumes an seinen Vater) wird die Länge aller Wörter in T (k) um 1 verkürzt. 1 In der Literatur wird oft der Begri 'prex codes' verwendet. Damit sind aber genau präx-freie Kodes gemeint sind. 2
2. Seltene Zeichen sind tiefer im Baum als häuge (f j > f k l j l k ). Beweis: Sei C optimal, aber j, k : f j > f k, l k < l j. Sei C ein Code bei dem die Wörter fur j und k vertauscht sind. Wenn C optimal ist, dann L(C ) L(C) und daher 0 L(C ) L(C) = i f i l i i f i l i = f j l j + f k l k f j l j f k l k = f j l k + f k l j f j l j f k l k = (l k l j ) (f j f k ) < 0, } {{ } } {{ } <0 >0 was einen Widerspruch darstellt. C kann daher nicht optimal sein. 3. Es existiert ein optimaler Codebaum, bei dem die zwei seltensten Zeichen Geschwister sind. Beweis: Sei f 1 f 2... f n, d.h., seien x n, x n 1 die zwei seltensten Zeichen (Anm.: es kann mehrere solche Zeichen geben). x n besitzt das längste Codewort (l n l i, i), denn gäbe es ein Wort x i mit l i > l n würde ein Vertauschen von x i und x n einen kürzeren Code liefern. Dann gilt: (a) x n muss einen Bruder besitzen, da der Binärbaum voll ist, und (b) dieser Bruder muss ein Blatt sein, denn wäre es ein innerer Knoten, gäbe es ein Zeichen x i mit l i > l n (Widerspruch). Sei dieses Blatt x j. Entweder x j = x n 1 oder x j x n 1. Falls x j x n 1, kann man x j und x n 1 vertauschen, ohne L(C) zu verschlechtern: L(C ) L(C) = i f i l i i f i l i 15.4 Human = f n 1 l j + f j l n 1 f n 1 l n 1 f j l j = (f n 1 f j ) (l j l n 1 ) 0. } {{ } } {{ } 0 0 Die Methode nach Human liefert garantiert einen optimalen Kodebaum. Mit folgender Vorgangsweise wird der Kodebaum konstruiert: Erstelle einen 'Wald' mit jeweils einen Baum pro Zeichen. Suche die beiden Bäume mit den kleinsten Wahrscheinlichkeiten und verbinde sie zu einen neuen Baum, welche nun die Summe der Wahrscheinlichkeiten der Unterbäume besitzt. Wiederhole den Vorgang, bis nur noch ein Baum übrig ist. 3
15.4.1 Implementierung Der Human-Algorithmus kann sehr eektiv mit einer Warteschlange Q mit Prioritäten implementiert werden, und zwar mit der Datenstruktur Halde. Dabei wird invers geordnet - d.h. das Minimum liegt an der Wurzel der Halde. Dem Algorithmus wird das Alphabet Z mit den zugehörigen Auftrittsfrequenzen f i s übergeben. HUFFMAN (Z,f) 1: n Z 2: INIT_Q (Z) 3: FOR i 1 TO (n-1) 4: z NEUER_KNOTEN 5: LINKS(z) MINIMUM(Q), ENTFERNE_MIN 6: RECHTS(z) MINIMUM(Q), ENTFERNE_MIN 7: f(z) f(x)+f(y) 8: EINFUEGEN(Q,z) 9: RETURN MINIMUM(Q) Analyse: Alle Operationen der Warteschlange mit Prioritäten (mit einer Halde implementiert) können in O(log n) durchgeführt werden. Dabei werden sie innerhalb der Schleife n 1 mal aufgerufen, d.h. T (n) = O(n log n). 15.4.2 Beweis der Optimalität von Human Sei Z = {x 1, x 2,..., x n } das zu kodierende Alphabet mit den Auftrittswahrscheinlichkeiten f 1 f 2... f n. Der Human-Algorithmus bestimmt den Codebaum für Z aus dem Codebaum für Z = Z \ {x n 1, x n } {w}, mit f(w) = f n 1 + f n. Der Beweis erfolgt mittels vollständiger Induktion: Der Human-Algorithmus liefert oensichtlich einen optimalen Codebaum für Z = 2. zu zeigen: Ist B ein optimaler Codebaum für Z, ist B auch ein optimaler Codebaum für Z. Es gilt l i = l i i = 1,..., n 2 l n 1 = l n = l(w) + 1 4
Für die Codelänge von B ergibt sich damit L(B) = n f i l i = f n l n + f n 1 l n 1 + f i l i = (f n + f n 1 )(l(w) + 1) + f i l i = f(w)l(w) + f(w) + f i l i = f(w) + L(B ). Sei B nicht optimal, d.h., B : L( B) < L(B), und B hat x n, x n 1 als Geschwister. Daraus kann man wiederum einen Baum B erzeugen, durch Ersetzen von x n, x n 1 durch w. Dann gilt: L( B) < L(B) f(w) + L( B ) < f(w) + L(B ) L( B ) < L(B ), was aber ein Widerspruch zur Annahme der Optimalität von B ist. 5