Präfixcodes und der Huffmn Algorithmus Präfixcodes und Codebäume Im Folgenden werden wir Codes untersuchen, die in der Regel keine Blockcodes sind. In diesem Fll können Codewörter verschiedene Länge hben und deshlb gehen wir von der Vektorschreibweise b und betrchten Codewörter ls Strings vribler Länge. Definition Sei ϕ : A Q + eine Codierung einer endlichen Menge A durch nichtleere Wörter (Strings) über einem Alphbet Q und C = Im(ϕ) der zugehörige Code. Mn bechte, dss die Abbildung ϕ dzu injektiv sein muss. Die Codierung ϕ knn wie folgt zu einer Abbildung ϕ : A Σ erweitert werden, mit der mn lle Wörter über A, lso lle Nchrichten über diesem Alphbet verschlüsseln knn: wobei die Konktention bezeichnet. ϕ (... n ) = ϕ( ) ϕ( )... ϕ( n ) Der Code C ist ein Präfixcode, wenn kein Codewort us C Präfix (lso Anfngsstück) eines nderen Codewortes us C ist. Der Code C ist eindeutig dekodierbr, wenn sich us jeder kodierten Nchricht diese Nchricht eindeutig rekonstruieren lässt, mit nderen Worten, wenn uch ϕ eine injektive Abbildung ist. Beobchtung: Jeder Präfixcode ist eindeutig decodierbr und jeder Blockcode ist uch ein Präfixcode und dmit eindeutig dekodierbr. Zuerst mcht mn sich klr, dss mn jeden Präfixcode durch einen sogennnten Bum repräsentieren knn. Ein Bum ist eine spezielle Struktur, mit der wir uns in Zukunft noch häufig beschäftigen werden. Definition: Ein Bum besteht us einer Menge V von Knoten mit einer speziellen Eltern-Kind-Reltion, welche die folgenden Eigenschften ht: Es gibt einen usgezeichneten Knoten r, den mn die Wurzel des Bums nennt und der keinen Elternknoten besitzt. Jeder Knoten ußer der Wurzel ht einen eindeutig bestimmten Elternknoten. Jeder Knoten v ist Nchfhre der Wurzel r, (d.h. v ist selbst die Wurzel oder ein Kind, Enkel, Urenkel, usw. von r). Ein Knoten, der keine Kinder ht, wir ls ein Bltt des Bums bezeichnet. Knoten, die mindestens ein Kind hben, nennt mn innere Knoten des Bums. Bäume werden häufig grphisch drgestellt, wobei die Wurzel den höchsten (bzw. niedrigsten) Punkt bildet und lle Kinder uf einem Niveu unter (bzw. über) ihre Elternknoten gezeichnet und mit dem Elternknoten durch eine Knte verbunden werden.
Für den Bum eines Präfixcodes verwendet mn einen speziellen Typ, in dem jeder innere Knoten v höchstens Q Kinder ht, die Knten von v zu den Kindern mit verschiedenen Symbolen us Q mrkiert sind und lle Wege, die von der Wurzel strten und ein Codewort us C ls Mrkierung hben, zu einem Bltt führen. Diese Blätter können zusätzlich durch ds codierte Symbol us A mrkiert werden. Die folgende Abbildung zeigt zwei Beispiele der Bumdrstellung eines Präfixcodes. Auf der linken Seite ist Q = {, } und in diesem Fll spricht mn von einem Binärcode und einem Binärbum. Wie mn leicht us der Abbildung erkennen knn, besteht die codierte Menge A us den Symbolen, und 3 und der Code C besteht us den Codewörtern, und. Der Bum uf der rechten Seite repräsentiert eine Codierung der Menge A = {,, 3, 4, 5 } über dem Alphbet Q = {,, } durch den Code C = {,,,, }. Wurzel r: Q = {,} Wurzel r: Q={,,} 3 3 5 4 Ht mn die Bumdrstellung eines Präfixcodes gegeben, dnn knn mn für jedes Codewort c C durch Strt im Wurzelknoten und Verfolgung des Weges, dessen Kntenmrkierungen durch die Buchstbenfolge von c vorgegeben ist, zum Bltt von c gelngen und dort ds codierte Symbol uslesen. Diesen Prozess knn mn uch beim Lesen der kodierten Nchricht usführen, wobei mn immer dnn, wenn mn bei einem Bltt ngekommen ist und dmit ein Symbol decodiert ht, wieder zurück zur Wurzel springen muss. Mn bechte, dss es uch eindeutig decodierbre Codes gibt, die keine Präfixcodes sind, z.b. C = {, }. Verfolgt mn ds Ziel, die Codierung einer Nchricht möglichst kurz zu hlten, muss mn versuchen, die einzelnen Codewörter kurz zu hlten, insbesondere die von häufig vorkommenden Symbolen. Andererseits knn mn bei festgelegtem Q nicht lle Codewörter beliebig kurz hlten. Der folgende Stz gibt Auskunft drüber, welche Schrnken mn generell erreichen knn.
Stz von Krft, Mc Milln () Sei C = {c,...,c u } ein eindeutig dekodierbrer Code und seien n,...,n u die zugehörigen Codewortlängen über Q, wobei Q = q. Dnn gilt: u q n k k= () Wenn positive gnze Zhlen n,..., n u die Ungleichung us () erfüllen, so gibt es uch einen Präfixcode C = {c,...c u } über einem Alphbet Q der Größe q mit den Codewortlängen n,...,n u. Beweis: Wir zeigen nur (). Sei Q = {,,...,, q } und o.b.d.a. n n... n u. Als erstes setzen wir c =... bestehend us n Nullen. Seien c,...,c i mit i < u schon beknnt dnn zeigen wir jetzt, wie mn induktiv c i+ bestimmt. Wir wählen c i+ ls lexikogrfisch kleinstes Wort der Länge n i+, ds c,...,c i nicht ls Präfix enthält. Gibt es dies überhupt? J, die c j, j < i+ verbieten zwr für die Whl von c i+ einige Wörter der Länge n i+, ber nicht lle. Jedes der c j verbietet q n i+ n j Wörter der Länge n i+, insgesmt sind lso verboten i q n i+ n j = q n i+ j= i j= q n j Wörter, ber diese Zhl ist wegen () echt kleiner ls q n i+, der Anzhl ller Wörter dieser Länge. Mithin existiert ds so definierte c i+. Beispiel: Sei q = und die gewünschten Codewortlängen seien n =, n = n 3 = n 4 = 3, n 5 = n 6 = 4. Wir hben 6 k= n k = und folglich gibt es einen dzu pssenden des Präfixcode. Die n Hnd des Beweises erzeugten Codewörter sind,,,,,. Der Huffmn Algorithmus In den folgenden Überlegungen wird die Ttsche eine entscheidende Rolle spielen, dss in typischen Nchrichten die verwendeten Zeichen us A nicht gleichhäufig uftreten. Mehr noch, wir wollen dvon usgehen, dss mn bereits eine Whrscheinlichkeitsverteilung für die reltive Häufigkeit des Auftretens der Symbole x us A kennt. Wir wollen diese reltive Häufigkeit mit Pr(x) bezeichnen. Um in diesem Zusmmenhng von einer Whrscheinlichkeitsverteilung zu sprechen, muss Pr(x) für jedes x A ein Wert zwischen und sein und drüber hinus muss die Gleichung x A Pr(r) = erfüllt sein. Ziel ist die Konstruktion eines Präfixcodes C, für den der Erwrtungswert
der Codewortlänge x A Pr(x) n(x) miniml ist, wobei n(x) die Länge des Codeworts ϕ(x) C bezeichnet. Ein solcher Code minimiert dnn ntürlich uch die erwrtete Gesmtlänge einer codierten Nchricht. Dieses Ziel erreicht mn mit dem sogennnten Huffmn Codes, einer vielbenutzten Technik zur Dtenkompression, der eine optimle Effizienz ht. Wir werden hier nur den Fll der Binärcodes, d.h. Q = {, } betrchten. Beispiel: Wir illustrieren diese Begriffsbildung noch einml n der Drstellung von zwei Binärcodes mittels binärer Bäume. Gegeben sei A = {, b, c, d, e, f} mit den reltiven Häufigkeiten der Symbole. Wir vergleichen die Codierung von A mit einen Bockcode mit einer nderen Codierung (die sich - wie wir sehen werden - us dem Huffmn-Algorithmus ergibt). Zeichen b c d e f rel. Häufigkeit in % 45 3 6 9 5 Blockcode opt. Präfixcode Als Binärbäume sehen die Codes dnn wie folgt us. In den Knoten sind zusätzlich die Gesmthäufigkeiten der drunter liegenden Blätter notiert. 86 4 58 8 4 : 45 b:3 c: d: 6 e: 9 f : 5 45 55 5 3 c: b: 3 4 d: 6 f : 5 e : 9 Blockkode optimler Huffmnkode Für den Blockcode ist offensichtlich der Erwrtungswert für die Länge eines Codeworts genu 3. Dgegen ergibt sich für den zweiten Code ein wesentlich besserer Wert, nämlich 45 + 3 3 + 3 + 3 6 + 4 9 + 4 5 =, 4 D es für den Algorithmus egl ist, ob wir mit reltiven Häufigkeiten (lso mit Whrscheinlichkeiten) oder mit bsoluten Häufigkeiten rbeiten, wird b jetzt mit f(x) eine Verteilungsfunktion bezeichnen, die für eine dieser zwei Möglichkeiten steht.
Die Grundidee für den Huffmn Code ist einfch: Seltene Zeichen in der Nchricht bekommen lnge Codewörter, häufiger uftretende Zeichen bekommen kurze Codewörter. Wenn x und y die seltensten Zeichen sind mit Häufigkeiten f(x) und f(y), so stelle mn sich vor, beide durch ein neues Zeichen z zu ersetzen, ds die Häufigkeit f(z) = f(x) + f(y) ht. Wenn mn dnn rekursiv ein Codewort für z berechnet ht, entstehen jene für x und y einfch durch Anhängen einer bzw.. Zur Relisierung des Huffmn-Algorithmus verwendet mn eine sogennnte Prioritätswrteschlnge. Ds ist eine Dtenstruktur, in der jeder Eintrg mit einem zusätzlichen Prioritätswert versehen ist. Dzu gibt es eine Funktion ExtrctMin, mit der mn den Eintrg mit dem kleinsten Prioritätswert entfernen knn. Der Algorithmus erzeugt die Bumdrstellung einer optimlen Codierung. Am Anfng ht mn für jedes Symbol x A einen (entrteten) Bum T(x), der nur us einer Wurzel besteht, die gleichzeitig ds einzige Bltt ist und x ls Mrkierung trägt. Der Prioritätswert dieses Bums ist p(t(x)) = f(x). Hier ist der Algorithmus im Pseudocode. Huffmn(A,f) : f Verteilungsfunktion uf A Q = empty PriorityQueue for ll x in A CreteTree T(x) Insert T(x) in Q with priority p(t(x))=f(x) repet A - times T=ExtrctMin(Q) T=ExtrctMin(Q) CreteTree T with new root r leftchild(r) = r(t) rightchild(r) = r(t) insert T in Q with priority p(t) = p(t) + p(t) T = ExtrctMin(Q) return T Der vom Algorithmus erzeugte Bum ist der Codebum eines optimlen Präfixcodes, wenn mn lle Knten zu linken Kinder mit einer und lle Knten zu rechten Kindern mit einer mrkiert. Die beiden folgenden Lemmt beweisen die Optimlität des Huffmn Codes. Lemm : Seien x, y A die Symbole mit den kleinsten Häufigkeiten f(x) f(y) f(u) für beliebige u A. Dnn gibt es einen optimlen Präfixcode für A, in dem die Codewörter für x und y die gleiche Länge hben und sich nur im letzten Bit unterscheiden. Beweis: Ein Präfixcode zur Codierung einer Symbolmenge A mit Verteilung f ist optiml, wenn für seinen Codebum T der Ausdruck B(T) := A f()d T() min-
imiert wird, wobei d T () die Tiefe des mit mrkierten Blttes in T bezeichnen soll. Sei nun T Codebum eines optimlen Präfixcodes und seien u, v die Symbole in zwei Zwillingsblättern mximler Tiefe, wobei f(u) f(v) gelten soll. Wir betrchten die Bäume T und T, die us T durch einfche Austuschopertionen entstehen von x gegen u und im zweiten Schritt von y gegen v, wie im Bild ngedeutet. x u u y y v u v x v x y T T T Wir wissen f(x) f(u), f(y) f(v) und d T (x) d T (u), d T (y) d T (v). Drus folgt B(T) B(T ) = A f()d T() A f()d T () = (f(u) f(x))(d T (u) d T (x)). Somit ist B(T) B(T ), ber d B(T) schon miniml ist, müssen bei Werte gleich sein. Anlog zeigt mn B(T ) B(T ) und folglich muss B(T) = B(T ) sein und wegen der Optimlität von T ist uch T optiml und T ht die behupteten Eigenschften. Ds folgende Lemm ht einen sehr ähnlichen Beweis. Lemm: Repräsentiere T einen optimlen Präfixcode für A und seinen x, y die Mrkierungen von zwei Zwillingsblätter in T. Sei z A ein neues Symbol mit f(z) = f(x)+f(y), A = (A \ {x, y}) {z} und T, der Bum, der us T durch Streichung der Blätter von x und y entsteht wobei der gemeinsme Vterknoten mit z mrkiert wird. Dnn repräsentiert T einen optimlen Präfixcode für A. Zusmmen hben wir Stz: Der Huffmn Algorithmus liefert optimle Präfixcodes.