Informatik

LZW-Kompression einfach erklärt und angewendet

LZW-Kompression einfach erklärt und angewendet
LZW-Kompression einfach erklärt und angewendet
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Die LZW-Kompression ersetzt wiederkehrende Zeichenfolgen durch Zahlencodes. Sie arbeitet verlustfrei: Beim Decodieren entsteht die ursprüngliche Eingabe vollständig wieder. Das benötigte Wörterbuch bauen Encoder und Decoder während der Verarbeitung in derselben Reihenfolge auf.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Wie ersetzt LZW wiederkehrende Muster?
Definition

Dynamisches Wörterbuch

Ein dynamisches Wörterbuch ist eine Tabelle, die während der Verarbeitung wächst. Sie enthält anfangs nur einzelne Zeichen. Neu erkannte Zeichenfolgen erhalten fortlaufende Codes.

LZW sucht immer das längste Muster, das bereits im Wörterbuch steht. Danach geschieht Folgendes:

  1. Der Code dieses bekannten Musters wird ausgegeben.
  2. Das Muster wird um das nächste Zeichen ergänzt.
  3. Die neue Kombination wird ins Wörterbuch aufgenommen.
  4. Die Verarbeitung beginnt beim noch nicht ausgegebenen Zeichen erneut.
Merke

Ausgegeben wird der Code eines bereits bekannten Musters. Die längere Kombination wird erst als neuer Eintrag gespeichert.

Das Wörterbuch muss nicht mitgesendet werden. Kennt der Decoder dieselbe Anfangstabelle, kann er die neuen Einträge aus der Codefolge in derselben Reihenfolge rekonstruieren.

Für die Beispiele auf dieser Seite gilt ein übersichtliches Schulmodell:

  • Die Bytewerte 0 bis 255 bilden das Anfangswörterbuch.
  • Neue Muster beginnen bei Code 256.
  • Jeder ausgegebene Code belegt 12 Bit.
  • Damit sind insgesamt $2^{12}=4096$ Codes möglich.

Praktische Varianten können zunächst 9 Bit verwenden und die Codebreite später erhöhen. Diese Varianten ändern nicht das Grundprinzip, aber die Größenrechnung.

Teste dich
Frage 1 von 1LeichtWas macht das LZW-Wörterbuch dynamisch?
Lösung: Es erhält während der Verarbeitung neue Zeichenfolgen. — Encoder und Decoder beginnen mit derselben Anfangstabelle und ergänzen sie anhand des Codeverlaufs.
Wie wird eine Zeichenfolge codiert?

Wir codieren BABAABBAA. Im Anfangswörterbuch stehen unter anderem:

  • A mit Code 65 beziehungsweise 041 im Hexadezimalsystem,
  • B mit Code 66 beziehungsweise 042 im Hexadezimalsystem.

Neue Einträge beginnen bei 256 beziehungsweise 100 im Hexadezimalsystem.

Beispiel

Die Tabelle zeigt jeweils das längste bekannte Muster und das unmittelbar folgende Zeichen.

Bekanntes MusterNächstes ZeichenNeuer EintragAusgabe
BABA = 25666
ABAB = 25765
BAABAA = 258256
ABBABB = 259257
BAAEndekein neuer Eintrag258

Damit lautet die Ausgabe dezimal:

66 65 256 257 258

Hexadezimal entspricht das:

042 041 100 101 102

Das Muster BA kann ab seinem zweiten Auftreten durch den einzelnen Code 256 vertreten werden. Später steht auch das längere Muster BAA im Wörterbuch.

Teste dich
Frage 1 von 1MittelBA ist bereits bekannt. Zusammen mit dem nächsten Zeichen A entsteht das noch unbekannte Muster BAA. Welcher Code wird ausgegeben?
Lösung: Der Code von BA — LZW gibt den Code des längsten bereits bekannten Musters aus. Deshalb wird der Code von BA ausgegeben und BAA neu gespeichert.
Wie entsteht beim Decodieren wieder der Originaltext?

Der Decoder liest zuerst den ersten Code und gibt dessen Zeichen aus. Bei jedem weiteren bekannten Code bildet er einen neuen Wörterbucheintrag aus:

vorheriges Muster + erstes Zeichen des aktuellen Musters

Beispiel

Wir decodieren 66 65 256 257 258.

Aktueller CodeAktuelles MusterNeuer WörterbucheintragBisherige Ausgabe
66Bnoch keinerB
65ABA = 256BA
256BAAB = 257BABA
257ABBAA = 258BABAAB
258BAAABB = 259BABAABBAA

Der rekonstruierte Text ist genau die ursprüngliche Eingabe BABAABBAA.

Die Reihenfolge ist entscheidend: Der Decoder nutzt nur Einträge, die bereits vorhanden sind oder die er im aktuellen Schritt eindeutig bilden kann.

Teste dich
Frage 1 von 1MittelDer vorherige Eintrag lautet AB, der aktuelle bekannte Eintrag BA. Welcher neue Eintrag entsteht?
Lösung: ABB — An das vorherige Muster AB wird das erste Zeichen des aktuellen Musters BA angehängt. Das ergibt ABB.
Was passiert bei einem noch unbekannten Code?

Manchmal verweist der nächste Code genau auf den Eintrag, den der Decoder gerade erst erzeugen muss. Dieser Sonderfall tritt bei unmittelbar wiederholten Mustern auf.

Dann gilt:

gesuchtes Muster = vorheriges Muster + erstes Zeichen des vorherigen Musters

Beispiel

Die Eingabe AAA wird zu den Codes 65 256.

Beim Decodieren liefert 65 zunächst A. Code 256 steht aber noch nicht im Wörterbuch. Das vorherige Muster ist A; sein erstes Zeichen ist ebenfalls A. Daher bildet der Decoder:

A + A = AA

Er gibt AA aus. Zusammen mit dem ersten A entsteht wieder AAA.

Merke

Ein unbekannter aktueller Code ist nicht automatisch ein Fehler. Ist er der gerade neu entstehende Eintrag, wird er aus dem vorherigen Muster und dessen erstem Zeichen gebildet.

Teste dich
Frage 1 von 1MittelDer vorherige Eintrag ist ABA, und der aktuelle Code bezeichnet den gerade entstehenden, noch unbekannten Eintrag. Welches Muster muss der Decoder bilden?
Lösung: ABAA — Das erste Zeichen von ABA ist A. Deshalb entsteht ABA + A = ABAA.
Wann spart LZW tatsächlich Platz?

Eine Codierung ist nur dann eine Kompression, wenn ihre Ausgabe weniger Speicher benötigt als das Original. Wiederholungen helfen, weil ein einzelner Code zunehmend längere Muster vertreten kann. Bei kurzen oder wenig regelmäßigen Daten kann das wachsende Wörterbuch jedoch kaum genutzt werden.

Beim Beispiel BABAABBAA entstehen fünf 12-Bit-Codes:

$$5\cdot12=60\text{ Bit}$$

Das sind 7,5 Byte. Werden nur ganze Bytes gespeichert, werden 8 Byte benötigt. Der ursprüngliche ASCII-Text besteht aus 9 Zeichen und damit aus 9 Byte. In diesem Modell wird also ein Byte eingespart.

Es kann auch anders ausgehen: Eine Eingabe mit 22 Zeichen benötigt als ASCII-Text 22 Byte. Entstehen daraus 16 Codes zu je 12 Bit, gilt:

$$16\cdot12=192\text{ Bit}=24\text{ Byte}$$

Die codierte Fassung ist dann zwei Byte größer.

Gut zu wissen

Kein verlustfreies Verfahren kann jede mögliche Eingabe verkürzen. Für alle $n$-Bit-Eingaben gibt es $2^n$ verschiedene Möglichkeiten. Es gibt aber insgesamt nur $2^n-1$ Bitfolgen, die kürzer als $n$ Bit sind. Deshalb können nicht alle Eingaben eindeutig einer kürzeren Ausgabe zugeordnet werden.

Teste dich
Frage 1 von 1SchwerEine kurze Datei enthält fast keine wiederkehrenden Muster. Welche Aussage ist am besten begründet?
Lösung: Die LZW-Ausgabe kann ebenso groß oder größer als die Eingabe werden. — LZW profitiert von wiederkehrenden Mustern. Fehlen sie, stehen dem Aufwand für Codes und Wörterbucheinträge kaum Einsparungen gegenüber.
Wende den Ablauf selbst an

Codiere im beschriebenen 12-Bit-Modell die Zeichenfolge ABABCABCDABCD. Verwende die ASCII-Codes von A bis D und neue Wörterbucheinträge ab 256.

Bestimme anschließend die Länge des Originals und der Codefolge.

Beispiel

Lösung

Die Codefolge lautet hexadezimal:

041 042 100 043 102 044 104

Es entstehen sieben Codes. Ihre Länge beträgt:

$$7\cdot12=84\text{ Bit}=10{,}5\text{ Byte}$$

In ganzen Bytes werden 11 Byte belegt. Das Original enthält 13 ASCII-Zeichen und benötigt 13 Byte. In diesem Modell spart die Codierung 2 Byte.

Kontrolliere besonders die Entscheidung vor jeder Ausgabe: Suche zuerst das längste bereits bekannte Muster. Speichere danach dieses Muster zusammen mit dem nächsten Zeichen als neuen Eintrag.

Teste dich
Frage 1 von 1SchwerZwei LZW-Varianten erzeugen dieselbe Anzahl von Codes. Variante A verwendet immer 12 Bit, Variante B beginnt mit 9 Bit. Was folgt daraus?
Lösung: Die tatsächliche Dateigröße kann trotz gleicher Codeanzahl verschieden sein. — Die Größe ergibt sich aus Anzahl und Breite der Codes sowie einer möglichen Auffüllung auf ganze Bytes.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • LZW-Kompression
    • Grundprinzip
      • wiederkehrende Muster durch Codes ersetzen
      • Original vollständig rekonstruieren
    • Wörterbuch
      • mit Einzelzeichen beginnen
      • während der Verarbeitung wachsen
    • Codierung
      • längstes bekanntes Muster ausgeben
      • verlängertes Muster speichern
    • Decodierung
      • Wörterbuch aus der Codefolge nachbauen
      • unbekannten Code aus dem vorherigen Muster bilden
    • Wirkung
      • Wiederholungen können Speicher sparen
      • kurze oder unregelmäßige Daten können wachsen
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWelche Eigenschaft unterscheidet LZW von einer verlustbehafteten Kompression?
Lösung: Der ursprüngliche Datenstrom lässt sich vollständig rekonstruieren. — LZW ist verlustfrei: Nach der Decodierung müssen alle ursprünglichen Daten wieder vorliegen.
Frage 2 von 3MittelEin Encoder findet das bekannte Muster AB und danach das Zeichen C; ABC fehlt noch. Was tut er?
Lösung: Er gibt den Code von AB aus und speichert ABC neu. — Ausgegeben wird das längste bekannte Muster. Seine Erweiterung um das nächste Zeichen wird zum neuen Wörterbucheintrag.
Frage 3 von 3SchwerEine Codierung liefert 10 Codes zu je 12 Bit. Das Original umfasst 14 Byte. Welche Bewertung stimmt bei Speicherung in ganzen Bytes?
Lösung: Die Codierung benötigt 15 Byte und ist damit 1 Byte größer. — $10\cdot12=120$ Bit. Geteilt durch 8 sind das 15 Byte. Gegenüber 14 Byte wächst die Datei um 1 Byte.

Du beherrschst den Kern von LZW, wenn du bei jedem Schritt begründen kannst, welches bekannte Muster ausgegeben, welcher neue Eintrag gespeichert und wie die Speicherwirkung berechnet wird.

Passend dazu