Referat zum Thema Huffman-Codes Darko Ostricki Yüksel Kahraman 05.02.2004 1 Huffman-Codes Huffman-Codes ( David A. Huffman, 1951) sind Präfix-Codes und das beste - optimale - Verfahren für die Codierung einzelner Zeichen, denen bestimmte Auftrittswahrscheinlichkeiten zugeordnet sind. Huffman-Codes sind bei der Datenkompression sehr effektiv. Einspaarungen von bis zu 20% bis 90 % sind möglich. 05.02.2004 2 1 Eigenschaften optimaler PräfixCodes Der Huffman-Algorithmus basiert auf den folgenden zwei Eigenschaften zur Charakterisierung optimaler Präfix-Codes: 1.Bei einem optimalen Code besitzen Zeichen, die häufiger auftreten, d.h. eine größere Wahrscheinlichkeit für das Auftreten besitzen, kürzere Codeworte als Zeichen, die weniger häufig auftreten. 2. Bei einem optimalen Code besitzen die beiden am seltensten auftretenden Zeichen, d.h. die beiden Zeichen mit den geringsten Auftrittswahrscheinlichkeiten, Codewörter gleicher Länge. 05.02.2004 3 Was sind Präfix-Codes? Fano- oder Präfixbedingung: Ein Code ist eindeutig umkehrbar -decodierbar-, falls keines der Codewörter den Anfang eines anderen Wortes des Codes bildet (hinreichende Bedingung), d.h. kein Wort w des Codes ist Anfang eines anderen Wortes w´: Jeder Code der diese Eigenschaft besitzt, heißt Präfixcode. Beispiel: Binärcodierung von 4 Zeichen, C = { 0 , 10 , 110 , 111 } ist eindeutig decodierbar, C = { 0 , 10 , 100 , 111 } 05.02.2004 dagegen nicht! 4 2 Wozu Huffman-Codes? Das Ziel kommerzieller Codierung ist die Ermöglichung der Kommunikation, der Datenverarbeitung und speicherung über technische Systeme mit möglichst hoher Effizienz. Die Huffman-Codierung ermöglicht es auf Grundlage des Alphabets und der Auftritts-Wahrscheinlichkeit der zu codierenden Symbole eine optimale Codierung zu ermitteln. Grundsätzlich gibt es für jede Nachrichtenquelle einen optimalen Code variabler Länge ( Symbol-Code ), der die Präfixbedingung erfüllt. 05.02.2004 5 Huffman-Code Beispiel Angenommen wir haben eine Datei mit 100.000 Charaktern welche wir Kompakt sichern wollen. Die zu Codierenden Zeichen stammen aus dem Alphabet A = { a,b,c,d,e,f }, |A| = 6 FÜR WEITERE INFOS... 16.3 Coremen introductions to algorithms 2 th edition 05.02.2004 6 3 Wahrscheinlichkeiten a b c d e f Häufigkeit (in 1000) 45 13 12 16 9 5 Fixedlegth codeword 000 001 010 011 100 101 Variablelength codeword 0 101 100 111 1101 1100 Eine Datei von 100.000 Charakters enthält nur die Zeichen a-f und ihre Häufigkeiten. Als 3 – Bit Cordwort kann die Datei in 300,000 Bits verschlüsselt werden und mit der „variable-length codeword“ Methode kann die Datei sogar in 224.000 Bits verschlüsselt werden. 05.02.2004 7 Fixer Längen-Code Wenn wir einen fixen Längen-Code verwenden,benötigen wir mindestens 3 Bits für 6 zu codierende Zeichen. a= 000, b=001, ... , f= 101. => (45*3+13*3+12*3+16*3+9*3+5*3)*1000= 300,000 Bits Diese Methode erfordert 300.000 Bits um die gesamte Datei zu codieren. Gibt es bessere Möglichkeiten? 05.02.2004 8 4 Variabler Längen-Code (Huffman) Beim variablen Längen-Code werden die häufig auftretende Zeichen über kurze Binärsequenzen codiert und selten auftretende Zeichen über längere Codeworte dargestellt. Das 1 – Bit Codewort „0“ repräsentiert a und das 4 Bit Codewort „1100“ repräsentiert f. Dieser Code erfordert: (45*1+13*3+12*3+16*3+9*4+5*4)*1000= 224,000 Bits für die Datei und spart einen geschätzten Wert von 25%. 05.02.2004 9 Präfix-Codes Man kann zeigen das die optimale Datenkompression von eines Charakter-Codes immer von einem Präfix-Code erreicht werden kann. Die Verschlüsselung ist immer für jeden Binären Charakter einfach. Wir Konkatenieren einfach die Codewörter die jeden Charakter der Datei repräsentieren und verfassen somit die codierte Nachricht. Beispiel – 3 Zeichen File abc als 0*101*100 = 0101100 Wobei * als Konkatenationsoperator dient 05.02.2004 10 5 Präfix-Codes Umgekehrt kann die codierte Nachricht ebenso simpel wieder decodiert werden. Decodieren des Strings : 001011101 wird geparst als 0*0*101*1101 anschließend gelesen „aabe“. 05.02.2004 11 Präfix-Codes Der optimale Code kann immer durch einen vollen binären Baum repräsentiert werden, wobei jeder Nicht-Blatt-Knoten zwei Kinder hat. Der „fixed-length code“ ist nicht optimal solange dieser nicht einen vollen binären Baum Repräsentiert. 05.02.2004 12 6 Präfix-Codes – Fixed lenght Abb. 16.4 (a)“ fixed length code “ a = 000,... f = 101. 05.02.2004 13 Präfix-Codes – Variable length Abb. 16.4 (b) Baum mit optimalem prefix code a= 0 , b=101, ..., f = 1100. 05.02.2004 14 7 Präfix-Codes Die Anzahl der Bits sind zum Verschlüsseln einer Datei erforderlich sind, werden auch Kosten des Baumes B(T) genannt. B(T) = ∑ f (c) dt (c) cεC dt (c) = Baumtiefe von c oder länge des Codewortes f (c) = Häufigkeit von c in der Datei C = Das Alphabet aus dem die Zeichen stammen und deren Häufigkeit positiv ist. 05.02.2004 15 Konstruieren eines Huffman Codes In dem Pseudocode welcher gleich folgt , ist C das Alphabet n Zeichen, sodass jedes Zeichen c ε C ein Objekt mit einer definierten Häufigkeit f [c] ist. Der Algorithmus erstellt einen Baum T, welcher zum optimalen Code korrespondiert. Es beginnt mit einer Gesamtmenge von | C | Blättern, und vollzieht eine Sequenz von | C | - 1 Operationen um den endgültigen Baum zu erstellen. Ein min–priority Queue Q, sortiert nach f wird benutzt um die 2 Objekte mit den niedrigsten Häufigkeiten miteinander zu verbinden. Beim Verbinden der 2 Objekte resultiert ein neues Objekt dessen Häufigkeit die Summe der Häufigkeiten der eben 2 verbundenen Objekte ist. 05.02.2004 16 8 Pseudo-Code des Huffman Algorithmus Huffman ( c ) 1. n Å |C| 2. Q Å C 3. for i Å 1 to n –1 4. do allocate a new node node z 5. left[z] Å x Å Extract-Min(Q) 6. right[z] Å y Å Extract-Min (Q) 7. f[z] Å f[x] + f[y] 8. INSERT (Q,z) 9. Return Extract- Min (Q) 05.02.2004 17 Erklärung zum Pseudocode: In Zeile 2 findet die Initialisierung der min-priority Queue mit den Charakteren in C statt .Die for Schleife in den Zeilen 3-8 extrahiert wiederholend 2 Knoten x und y ,die niedrigsten Häufigkeiten in der Queue , und ersetzt diese als neuen Knoten z in die Queue. Die Häufigkeit von z berechnet sich in der Summe der Häufigkeit von x und y in der Zeile 7.Der Knoten z hat x als sein linkes und y als sein rechte Kind. Nach n – 1 Zusammenschlüssen (engl. mergers) wird der Knoten links in der Queue in der Zeile 9, was der Root des Code Baumes ist zurückgegeben. 05.02.2004 18 9 Beispiel Huffman Codes 05.02.2004 19 Beispiel Huffman Codes 05.02.2004 20 10 Beispiel Huffman Codes 05.02.2004 21 Beispiel Huffman Codes 05.02.2004 22 11 Dokumentation zum Beispiel Die Abbildungen a-f zeigen die Inhalte der Queue welche nach der Häufigkeit sortiert sind. Bei jedem Schritt werden die 2 Bäume mit den niedrigsten Häufigkeiten zusammengefaßt. Die übrig gebliebenen Objekte werden als Rechtecke dargestellt und beinhalten ihr Zeichen sowie dessen Häufigkeit.Interne Knoten werden als Kreise dargestellt, welche als Wert die Summe der Häufigkeiten ihrer Kinder enthalten. Eine Kante verbindet die internen Konten mit seinen Kindern, die mit 0 gekennzeichneten zu einem linken Kind und die mit 1 gekennzeichneten zu einem rechten Kind.Beginnend bei der Wurzel ist das Codewort die Sequenz der Kantenbeschriftungen. (a) Initialisierende Menge von n = 6 Knoten . (b) (b)-(e) Zwischenschritte (c) (f) Der finale Baum. 05.02.2004 23 Das Laufzeitverhalten des Huffman Codes bertägt O(n log n) Wir nehmen an das Q als binärer min-heap implementiert wäre. ( Kapitel 6 ,2 edition introductions to algorithms by cormen). Für die Summe von n Zeichen aus dem Alphabet C, beträgt die Laufzeit der Initialisierung des min-heaps (in der Zeile 2 ) O(n). Die For Schleife in den Zeilen 3-8 wird exakt n –1 mal ausgeführt und im Worst Case erfordert jede Heap Operation eine Laufzeit von O(lg n); Somit beträgt die Performance des Huffman Algorithmus bei n Zeichen O(n log n). 05.02.2004 24 12 Korrektheit des Huffman-Codes •Der Code repräsentiert einen vollständigen Baum T . •Enthält die Zeichen a und b mit den geringsten Häufigkeiten an der tiefsten Stelle des Baumes. •Die Blätter a und b und sind Geschwister. •Das Zeichen mit der höchsten Häufigkeit ist das linke (bzw. rechte) Kind von der Wurzel. •Der Baum ist vollständig. •Ein tiefer gelegenes Blatt hat stets eine geringere oder gleiche Wahrscheinlichkeit wie die höheren Blätter. 05.02.2004 25 Lemma Theorem Nach dem Lemma-Theorem kann nachgewiesen werden das ein durch den Huffman-Algorithmus erstellter Code besser oder mindestens gleich so gut ist wie ein anderer Präfix-Code der ebenfalls durch einen vollständigen Baum repräsentiert werden kann. (für nähere Informationen siehe Kapitel 6 ,2nd Edition Introductions to Algorithms by Cormen) 05.02.2004 26 13 Quellen Titel: Introductions to Algorithms 2nd Edition Autor: Cormen Auszüge aus Kapitel 6 Titel: Ausarbeitung zur Vorlesung - Theoretische Informatik I Autor: Heribert Koch Auszüge aus Kapitel 2.6 Informationstheorie und Datenkompression 05.02.2004 27 14