www.wikidata.de-de.nina.az
Die Huffman Kodierung ist eine Form der Entropiekodierung die 1952 von David A Huffman entwickelt und in der Abhandlung A Method for the Construction of Minimum Redundancy Codes publiziert wurde 1 Sie ordnet einer festen Anzahl an Quellsymbolen jeweils Codeworter mit variabler Lange zu In der Informationstechnik ist sie ein Prafixcode der ublicherweise fur verlustfreie Kompression benutzt wird Wie bei anderen Entropiekodierungen werden haufiger vorkommende Zeichen mit weniger Bits reprasentiert als seltener vorkommende Zeichen Inhaltsverzeichnis 1 Grundlagen 2 Geschichte 3 Algorithmus 3 1 Mittlere Wortlange 3 2 Beispiel 4 Dekodierung 4 1 Beispiel 5 Pseudocode 5 1 Erzeugen des Baumes 5 2 Erzeugen des Codebuchs 6 Optimalitat 7 Laufzeit 8 Adaptive Huffman Kodierung 9 Siehe auch 10 Literatur 11 Weblinks 12 EinzelnachweiseGrundlagen BearbeitenUm Daten moglichst redundanzfrei darzustellen mussen die Quellsymbole mit Codewortern unterschiedlicher Wortlangen kodiert werden Die Lange der Codeworter entspricht dabei idealerweise ihrem Informationsgehalt Um einen Code auch wieder eindeutig dekodieren zu konnen muss er die Kraftsche Ungleichung erfullen und zusatzlich noch prafixfrei sein d h kein Codewort darf der Beginn eines anderen sein Die Grundidee ist einen k naren Wurzelbaum ein Baum mit jeweils k Kindern je Knoten fur die Darstellung des Codes zu verwenden In diesem sog Huffman Baum stehen die Blatter fur die zu kodierenden Zeichen wahrend der Pfad von der Wurzel zum Blatt das Codesymbol bestimmt Im Gegensatz zur Shannon Fano Kodierung wird der Baum dabei von den Blattern zur Wurzel englisch bottom up erstellt Dieser Baum kann mit einem Heap und einer Vorrangwarteschlange implementiert werden 2 3 Im Unterschied zum Morsecode benotigt man bei einer Huffman Codierung keine Trennzeichen Eine Trennung der Codeworter ist nicht notwendig da die Codierung prafixfrei ist Dadurch ist kein Codewort Anfang eines anderen Codewortes Der bei der Huffman Kodierung gewonnene Baum liefert garantiert eine optimale und prafixfreie Kodierung D h es existiert kein symbolbezogenes Kodierverfahren das einen kurzeren Code generieren konnte wenn die Auftrittswahrscheinlichkeiten der Symbole bekannt sind Geschichte BearbeitenIm Jahre 1951 hatten David A Huffman und seine Klassenkameraden am MIT im Kurs Informationstheorie die Wahl zwischen einer Seminararbeit und einer Abschlussprufung Die Seminararbeit betreut von Professor Robert M Fano sollte die Findung des effizientesten binaren Codes thematisieren Huffman der nicht in der Lage war die Effizienz eines Codes zu beweisen war nur knapp vor dem Entschluss aufzugeben und sich fur die Abschlussprufung vorzubereiten als er auf die Idee stiess einen frequenzsortierten Binarbaum zu verwenden und somit in kurzester Zeit jene Methode als effizienteste beweisen konnte Auf diese Weise ubertraf Huffman seinen Professor Fano der gemeinsam mit dem Begrunder der Informationstheorie Claude Shannon einen ahnlichen Code entwickelte Indem Huffman den Baum von unten nach oben anstatt von oben nach unten erstellte vermied er die grosste Schwachstelle der suboptimalen Shannon Fano Kodierung 4 Algorithmus Bearbeiten nbsp Veranschaulichung einer Huffman Kodierung Das Quellalphabet ist X A B C D E displaystyle X A B C D E nbsp und das Codealphabet ist C 0 1 displaystyle C 0 1 nbsp Schritt 1 zeigt den Originaltext Die Schritte 2 bis 6 erzeugen den Baum Der fertige Baum in Schritt 6 wird durchlaufen um das Codebuch zu erzeugen Schritt 7 zeigt das Codebuch und Schritt 8 den codierten Text Definitionen X displaystyle X nbsp ist das Quellalphabet der Zeichenvorrat aus dem die Quellsymbole bestehen p x displaystyle p x nbsp ist die A priori Wahrscheinlichkeit und relative Haufigkeit des Symbols x displaystyle x nbsp die relative Haufigkeit C displaystyle C nbsp ist das Codealphabet der Zeichenvorrat aus dem die Codeworter bestehen m displaystyle m nbsp ist die Machtigkeit C displaystyle vert C vert nbsp des Codealphabetes C displaystyle C nbsp die Anzahl der verschiedenen ZeichenErzeugen des Baumes Ermittle fur jedes Quellsymbol die relative Haufigkeit d h zahle wie oft jedes Zeichen vorkommt und teile durch die Anzahl aller Zeichen Erstelle fur jedes Quellsymbol einen einzelnen Knoten die einfachste Form eines Baumes und notiere im Knoten die Haufigkeit Wiederhole die folgenden Schritte so lange bis nur noch ein einziger Baum ubrig ist Wahle die m displaystyle m nbsp Teilbaume mit der geringsten Haufigkeit in der Wurzel bei mehreren Moglichkeiten die Teilbaume mit der geringsten Tiefe Fasse diese Baume zu einem neuen Teil Baum zusammen Notiere die Summe der Haufigkeiten in der Wurzel Konstruktion des Codebuchs Ordne jedem Kind eines Knotens eindeutig ein Zeichen aus dem Codealphabet zu Lies fur jedes Quellsymbol Blatt im Baum das Codewort aus Beginne an der Wurzel des Baums Die Codezeichen auf den Kanten des Pfades von oben nach unten ergeben das zugehorige Codewort Kodierung Lies ein Quellsymbol ein Ermittle das zugehorige Codewort aus dem Codebuch Gib das Codewort aus Mittlere Wortlange Bearbeiten Die mittlere Lange eines Codeworts kann auf drei Arten berechnet werden Uber die gewichtete Summe der Codewortlangen l x X p x l x displaystyle overline l sum x in X p x l x nbsp Die Summe aus der Anzahl der Schritte im Baum multipliziert mit der Haufigkeit eines Symbols dd Indem man die Auftrittswahrscheinlichkeiten an allen Zwischenknoten des Huffman Baums summiert Bei ausschliesslich gleicher Haufigkeit der zu codierenden Elemente ist die mittlere Langel log 2 m displaystyle l log 2 m nbsp mit m N displaystyle m in N nbsp als Anzahl der zu codierenden Elemente dd Beispiel Bearbeiten nbsp Ein Huffman Baum Die Wurzel des Baumes befindet sich rechts die Blatter links Das Quellalphabet sei X a b c d displaystyle X a b c d nbsp Als Codealphabet wahlen wir den Binarcode C 0 1 displaystyle C 0 1 nbsp und m C 2 displaystyle m vert C vert 2 nbsp Der Text a a b a b c a b c d displaystyle aababcabcd nbsp soll komprimiert werden Zuerst werden die relativen Haufigkeiten bestimmt p a 0 4 p b 0 3 p c 0 2 p d 0 1 displaystyle begin aligned p a amp 0 4 p b amp 0 3 p c amp 0 2 p d amp 0 1 end aligned nbsp Es wird ein Huffman Baum konstruiert und anschliessend die Codeworter an den Kanten eingetragen siehe Bild rechts Daraus ergibt sich folgendes Codebuch a 1 b 01 c 001 d 000 displaystyle begin aligned a amp rightarrow 1 b amp rightarrow 01 c amp rightarrow 001 d amp rightarrow 000 end aligned nbsp Mit diesem Codebuch wird der ursprungliche Text kodiert Originaltext a a b a b c a b c dKodierter Text 1 1 01 1 01 001 1 01 001 000Diese Huffman Kodierung kodiert jedes Symbol mit durchschnittlich l 0 4 1 0 3 2 0 2 3 0 1 3 0 4 0 6 0 6 0 3 1 9 displaystyle overline l 0 4 cdot 1 0 3 cdot 2 0 2 cdot 3 0 1 cdot 3 0 4 0 6 0 6 0 3 1 9 nbsp Bit Das ist die mittlere Codewortlange Bei einer naiven Kodierung wurde jedes der 4 Symbole mit log 2 4 2 displaystyle log 2 4 2 nbsp Bit kodiert Die Entropie liegt bei H X 0 4 log 2 0 4 0 3 log 2 0 3 0 2 log 2 0 2 0 1 log 2 0 1 0 529 332 1 85 displaystyle begin aligned H X amp 0 4 cdot log 2 0 4 0 3 cdot log 2 0 3 0 2 cdot log 2 0 2 0 1 cdot log 2 0 1 amp 0 529 332 amp 1 85 end aligned nbsp Bit je Symbol Dadurch dass der Informationsgehalt je Quellsymbol keine ganze Zahl ist verbleibt bei der Kodierung eine Rest Redundanz Dekodierung BearbeitenZur Dekodierung eines Huffman kodierten Datenstroms ist beim klassischen Verfahren das im Kodierer erstellte Codebuch notwendig Grundsatzlich wird dabei umgekehrt als im Kodierungsschritt vorgegangen Der Huffman Baum wird im Dekodierer wieder aufgebaut und mit jedem eingehenden Bit ausgehend von der Wurzel der entsprechende Pfad im Baum abgelaufen bis man an einem Blatt ankommt Dieses Blatt ist dann das gesuchte Quellsymbol und man beginnt mit der Dekodierung des nachsten Symbols wieder an der Wurzel Beispiel Bearbeiten nbsp Der Dekodierer hat das Codebuch a 1 b 01 c 001 d 000 displaystyle begin aligned a amp rightarrow 1 b amp rightarrow 01 c amp rightarrow 001 d amp rightarrow 000 end aligned nbsp und die empfangene Nachricht 1101101001101001000 Jetzt wird fur jedes empfangene Bit ausgehend von der Wurzel der Pfad im Baum abgelaufen bis ein Blatt erreicht wurde siehe Abbildung Sobald ein Blatt erreicht wurde speichert der Dekodierer das Symbol des Blattes und beginnt wieder bei der Wurzel bis das nachste Blatt erreicht wird Daraus ergibt sich der dekodierte Text Kodierter Text 1 1 01 1 01 001 1 01 001 000Dekodierter Text a a b a b c a b c dPseudocode BearbeitenDie folgenden Beispiele in Pseudocode zeigen Funktionen fur die Generierung der Huffman Kodierung Erzeugen des Baumes Bearbeiten Diese Funktion erzeugt einen Huffman Tree als Min Heap und gibt einen Zeiger auf den Wurzelknoten zuruck Die Knoten des Min Heap werden in einer Vorrangwarteschlange gespeichert left linker Kindknoten right rechter Kindknoten top Elternknoten minHeap Vorrangwarteschlange fur den Min Heap function createHuffmanTree symbolList frequencyList symbolsCount Fugt die Knoten mit Symbol und Haufigkeit in die Vorrangwarteschlange ein foreach symbol in symbolList Knoten mit Symbol und Haufigkeit in minHeap einfugen Der HuffmanTree wird schrittweise erzeugt bis sich alle Knoten einem Baum befinden und nur noch der Wurzelknoten in der Vorrangwarteschlange ist while die Anzahl der Knoten in minHeap ist nicht 1 Solange die Anzahl der Knoten in der Vorrangwarteschlange nicht 1 ist Entfernt die zwei Knoten mit der kleinsten Haufigkeit aus der Vorrangwarteschlange left minHeap top minHeap pop right minHeap top minHeap pop Erzeuge einen neuen inneren Knoten top mit der Summe der Haufigkeiten der zwei Knoten left gt frequency und right gt frequency Fugt die zwei Knoten mit der kleinsten Haufigkeit als linken und rechten Kindknoten des neuen inneren Knoten in den Baum ein top gt left left top gt right right minHeap push top Fugt den neuen Knoten in die Vorrangwarteschlange ein return minHeap top Gibt einen Zeiger auf den Wurzelknoten zuruck Erzeugen des Codebuchs Bearbeiten Diese rekursive Funktion erzeugt das Codebuch fur die Huffman Kodierung indem sie jedem Symbol des Quellalphabet ein binares Codewort als Zeichenkette zuordnet dictionary Zuordnungstabelle fur das Codebuch Diese rekursive Funktion erzeugt das Codebuch fur die Huffman Kodierung und speichert es in der Variable dictionary function createDictionary node codeword dictionary if der Knoten ist node ist leer return Abbruchbedingung wenn kein linker oder rechter Teilbaum vorhanden ist if node gt symbol is kein innerer Knoten also ein Blatt Wenn der Knoten kein innerer Knoten also ein Blatt ist dictionary insert node gt symbol codeword Fugt die Kombination aus Symbol und Codewort dem Codebuch hinzu createDictionary node gt left concat codeword 0 dictionary Rekusiver Aufruf fur den linken Teilbaum das Codesymbol 0 fur die linke Kante wird angefugt createDictionary node gt right concat codeword 1 dictionary Rekusiver Aufruf fur den rechten Teilbaum das Codesymbol 1 fur die rechte Kante wird angefugt Optimalitat BearbeitenFur mittlere Codewortlange l displaystyle overline l nbsp eines Huffman Codes gilt 5 H X l H X 1 displaystyle mathrm H X leq overline l leq mathrm H X 1 nbsp Das bedeutet im Mittel benotigt jedes Codesymbol mindestens so viele Stellen wie sein Informationsgehalt hochstens jedoch eine mehr l H X displaystyle overline l mathrm H X nbsp gilt genau dann wenn alle Wahrscheinlichkeiten Zweierpotenzen sind 2 m x m x N displaystyle 2 m x m x in mathbb N nbsp In dem Fall sagt man die Huffman Kodierung sei optimal bezuglich der Entropie Fasst man n displaystyle n nbsp Quellsymbole zu einem grossen Symbol y displaystyle y nbsp zusammen so gilt fur die mittleren Codesymbollangen l y displaystyle overline l y nbsp H n X l y H n X 1 n displaystyle mathrm H n X leq overline l y leq mathrm H n X frac 1 n nbsp das heisst mit zunehmender Anzahl n displaystyle n nbsp gemeinsam kodierter Quellsymbole geht die mittlere Codewortlange asymptotisch gegen die Entropie die Huffman Kodierung ist asymptotisch optimal Diese Optimalitat der Huffman Kodierung lasst sich mit vollstandiger Induktion beweisen 6 7 Laufzeit BearbeitenSei d displaystyle d nbsp die Anzahl der Zeichen des Originaltexts und n displaystyle n nbsp die Anzahl der verschiedenen Zeichen Die erste Anweisung die die Haufigkeiten der Zeichen zahlt hat die asymptotische Laufzeit O n displaystyle O n nbsp Die for Schleife iteriert uber die verschiedenen Zeichen im Quellalphabet Diese Schleife iteriert lediglich O d displaystyle O d nbsp Mal und nicht O n displaystyle O n nbsp Mal Die while Schleife beginnt mit einer Vorrangwarteschlange die d displaystyle d nbsp Elemente enthalt und reduziert diese in jeder Iteration um ein Element Sie iteriert also O d displaystyle O d nbsp Mal In jeder Iteration ruft sie zweimal die Funktion pop und einmal die Funktion push auf jeweils mit einer asymptotischen Laufzeit von O log d displaystyle O log d nbsp bei Verwendung eines Heaps Alle anderen Operationen innerhalb der while Schleife sind in konstanter Laufzeit implementierbar Die Laufzeit der while Schleife ist also O d log d displaystyle O d cdot log d nbsp Damit ist die Gesamtlaufzeit fur die Huffman Kodierung O n d log d displaystyle O n d cdot log d nbsp 8 Adaptive Huffman Kodierung BearbeitenDie adaptive Huffman Kodierung aktualisiert laufend den Baum Der anfangliche Baum wird erzeugt indem eine vorgegebene Wahrscheinlichkeitsverteilung fur alle Quellsymbole angenommen wird bei volliger Unkenntnis der Quelle eine Gleichverteilung Mit jedem neuen Quellsymbol wird dieser aktualisiert wodurch sich ggf auch die Codesymbole andern Dieser Aktualisierungsschritt kann im Dekodierer nachvollzogen werden so dass eine Ubertragung des Codebuchs nicht notig ist Mit dieser Methode kann ein Datenstrom on the fly kodiert werden Er ist jedoch erheblich anfalliger fur Ubertragungsfehler da ein einziger Fehler zu einer ab der Fehlerstelle komplett falschen Dekodierung fuhrt Siehe auch BearbeitenArithmetisches Kodieren Bereichskodierung Shannon Fano Kodierung Tunstall Kodierung Asymmetric Numeral Systems Context Adaptive Binary Arithmetic CodingLiteratur BearbeitenThomas M Cover Joy A Thomas Elements of Information TheoryWeblinks BearbeitenFreie Universitat Berlin Institut fur Informatik Prafixcodes und der Huffman Algorithmus Freie Universitat Berlin Institut fur Informatik Huffman Kodierung SwissEduc Huffman Code LNTwww Huffman und Shannon Fano Codierung Huffman Coding Java Codebeispiel in Java Paul E Black National Institute of Standards and Technology Huffman Coding Dictionary of Algorithms and Data Structures Huffman Tree Generator Web Application Einzelnachweise Bearbeiten D A Huffman A method for the construction of minimum redundancy codes In Proceedings of the I R E September 1952 S 1098 1101 compression ru PDF David Wagner University of California Berkeley Data Compression via Huffman Coding Northeastern University Priority Queue Heapsort Huffman Code Profil David A Huffman Strutz Bilddatenkompression SpringerVieweg 2009 University of California Berkeley Proof of Optimality of Huffman Coding University of Toronto Proof of Optimality of Huffman Codes Justus Piater Universitat Innsbruck Huffman Coding Algorithmus und Analyse Abgerufen von https de wikipedia org w index php title Huffman Kodierung amp oldid 238947543