27.1.2 Der Huffman - Algorithmus | |
Prinzip der Kompression | Die Idee
der Komprimierung beruht auf der Tatsache, dass die Zeichen eines Textes
in unterschiedlichen
Häufigkeiten auftreten. Dies wird schon sehr
deutlich bei dem Wort "MISSISSIPPI". Die relativen Häufigkeiten der
einzelnen Buchstaben sind:
H(M)= 0.09 Nun weicht man von der üblichen Kodierung der Zeichen ab. Solche Zeichen, die häufiger vorkommen, bekommen einen Kode, der im Speicher weniger Platz belegen als Zeichen, die weniger häufig vorkommen. In folgendem Kode sind diese Forderungen erfüllt. Code(M) = 100 Die Zeichenkette "MISSISSIPPI" lässt sich dann wesentlich kürzer codieren: Code(MISSISSIPPI) = 100110011001110110111 die unterschiedliche Färbung zeigt, zu welchen Buchstaben sie gehören, genauer, jedes mal wenn sich die Farbe ändert, beginnt ein neues Zeichen. Durch Abzählen findet man, dass die Datenmenge der Zeichenkette jetzt nur noch 21 bit hat, eine Kompression auf ca. 23,9% der ursprünglichen Datenmenge.
Die Antworten auf diese drei Fragen findet wir im Huffman-Algorithmus, der an unserem Beispiel "MISSISSIPPI" aufgezeigt wird
|
Huffman - Algorithmus |
![]() Im ersten Schritt werden die Zeichen sortiert nach der rel. Häufigkeiten ihres Auftretens im zu komprimierenden Text aufgeschrieben:
Man sucht sich die zwei Häufigkeiten heraus, die die kleinste Summe bilden, das wären 0,09 + 0,18 = 0,27. Es ist dies immer die Summe der ersten beiden Glieder. Die Summe ersetzt die beiden Summanden samt ihren Zeichen, die unter die 0,27 gestellt werden. Diese Summe wird dann wieder in die Reihe so eingeordnet, dass die Sortierung nach der Häufigkeit erhalten bleibt.
Der zweite Schritt des Algorithmus wird nun wiederholt: Die Summanden, die jetzt die kleinste Summe bilden, sind 0,27 und 0,36, ihre Summe ist 0,63. Ihre Zusammenfassung und ergibt nach dem Neuordnen den folgenden Baum.:
Der letzte Schritt ist erreicht, wenn alle Zeichen in den Baum eingefügt sind..
Dieser Baum zeichnet sich dadurch aus, dass in der sog. Wurzel immer die 1, und in einem Knoten immer eine Zahl steht, die die Summe ihrer Knoten darunter ist. Die Verbindungslinien werden zu den Kanten des Baumes. Nach links - unten weisende Kanten bekommen den Wert 0, die nach rechts - unten weisenden den Wert 1 zugeordnet. In den Blättern stehen dann die Zeichen. So erreicht man den Buchstaben P wenn man dem Pfad 1-0-1 folgt. Wir geben deshalb dem Buchstaben P den Kode Code(P)=101. Der Algorithmus, der den Baum aufbaut ist einfach, denn, wie wir gesehen haben, wird beim Einfügen eines neuen Elementes der Baum nur ergänzt aber nicht umstrukturiert. Ein Blick auf den Baum zeigt auch:
wenn man einen Text mit mehr als zwei Zeichen codieren will, können die
0
und 1
nicht gleichzeitig vergeben werden, sondern nur die
1
oder die 0, da an mindestens einem der beiden Kantenenden der Restbaum
angehängt ist. Diese Tatsache beantwortet die Frage, warum wir für den
Text MISSISSIPPI den
Code(S)=0, Code(I)=1,
Code(P)=01 und Code(M)=10
nicht wählen können, denn sonst könnten wir den Baum und seine Struktur
nicht mehr nützen. Aber darauf wollen wir nicht verzichten, warum, das
zeigt die folgenden Überlegungen: Wie man leicht einsehen kann, dient
der Huffman-Baum nicht nur der Kodierung sondern auch der Dekodierung.
Übersendet man also mittels Huffman-Algorithmus komprimierte Zeichenkette, so muss man
dem Empfänger den Kodierungsbaum mitschicken, damit er die empfange
Zeichenkette wieder decodieren also dekomprimieren kann. In der
Praxis geschieht dies so, dass man in den sog. Header einer komprimierten
Datei den Huffman-Baum schreibt. Das hat natürlich zur Konsequenz, dass das
Komprimieren sich erst dann lohnt, wenn der Speichergewinn nicht durch das
Mitspeichern des Baum wieder verloren geht. Je größer die Datei ist, um so
mehr lohnt die Kompression. Bei dem aufgezeigtem
Huffman-Algorithmus ist eine Situation noch nicht berücksichtigt: Wie
wird nach 'Häufigkeiten sortiert', wenn nach der Addition eine
Häufigkeit entsteht, die ein weiteres Mal schon vorkommt. Wir werden
dieses Problem bei der Aufgabe 3 genauer betrachten. |
Zum Demo-Applet ETH-Zürich |
Das
Applet auf der Seite von ETH-Zürich erzeugt zu einer eingegebenen
Zeichenkette den Huffman-Kode. Zusätzlich kann man den Aufbau des
Huffman-Baumes schrittweise verfolgen. |
zu | 27.1.3 Übungen |
zur Startseite | www.pohlig.de (C) 2006 MPohlig |