Informatik

LZW-Kompression: Codieren, decodieren und Platzbedarf prüfen

LZW-Kompression: Codieren, decodieren und Platzbedarf prüfen

LZW-Kompression: Codieren, decodieren und Platzbedarf prüfen
LZW-Kompression: Codieren, decodieren und Platzbedarf prüfen
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. Der Encoder ist das Programm, das die Eingabe codiert; der Decoder stellt daraus die Originaldaten wieder her. Beide bauen das benötigte Wörterbuch 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.

Am Ende der Eingabe gibst du nur noch den Code des letzten bekannten Musters aus. Ohne nachfolgendes Zeichen entsteht kein neuer Eintrag.

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 und dieselben Verfahrensregeln, kann er die neuen Einträge aus der Codefolge in derselben Reihenfolge rekonstruieren.

Ein Bit hat den Wert 0 oder 1; ein Byte besteht aus 8 Bit. 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 von 0 bis 4095 möglich.
  • Die Beispiele füllen das Wörterbuch nicht vollständig. Wäre es voll, würden wir vorhandene Einträge weiterverwenden und keine neuen hinzufügen.
  • Wir zählen nur die dicht gepackten Codes und nötige Füllbits bis zum nächsten ganzen Byte. Zusätzliche Dateiinformationen und besondere Steuer- oder Endcodes lassen wir weg; das Ende der Codefolge gilt als bekannt.

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. ASCII ordnet Zeichen Zahlencodes zu. Es ist ein 7-Bit-Zeichensatz; hier wird jedes ASCII-Zeichen in einem ganzen Byte gespeichert. Die Buchstaben unserer Beispiele gehören zu ASCII. Im Anfangswörterbuch stehen unter anderem:

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

Das Hexadezimalsystem hat die Basis 16. Seine Ziffern sind 0 bis 9 und A bis F. Beispielsweise bedeutet 041 die Zahl $0\cdot16^2+4\cdot16+1=65$. Die führende Null verändert den Wert nicht.

Neue Einträge beginnen bei 256 beziehungsweise 100 im Hexadezimalsystem. Für die Übung brauchst du außerdem C = 67 = 043 und D = 68 = 044.

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. Der Encoder hat ihn schon angelegt, während der Decoder beim Aufbau noch einen Schritt zurückliegt. Der Sonderfall ist nur gültig, wenn der unbekannte Code genau die nächste freie Codenummer hat. Ein anderer unbekannter Code zeigt im vereinbarten Modell eine ungültige Codefolge an.

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. Nur wenn er die nächste freie Codenummer hat, wird sein Muster 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?

Ob eine konkrete Codierung Platz spart, erkennst du am Vergleich der Bit- beziehungsweise Bytelängen. Ein Kompressionsverfahren kann bei einzelnen Eingaben auch eine größere Ausgabe erzeugen. 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. Angenommen, eine Eingabe umfasst 22 ASCII-Zeichen, die in 22 Byte gespeichert sind, und es entstehen 16 Codes zu je 12 Bit. Dann 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 $1+2+4+\dots+2^{n-1}=2^n-1$ Bitfolgen, die kürzer als $n$ Bit sind. Dabei zählt auch die leere Bitfolge mit; $n$ ist eine positive ganze Zahl. 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, ersetzen die 12-Bit-Codes oft nur einzelne 8-Bit-Bytes. Das Wörterbuch selbst wird nicht mitgespeichert.
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

Suche jeweils das längste bekannte Muster. Ergänze es um das nächste Zeichen, um den neuen Wörterbucheintrag zu bilden. Die Ausgabe bleibt der Code des bekannten Musters:

Bekanntes MusterNächstes ZeichenNeuer EintragAusgabe dezimal
ABAB = 25665
BABA = 25766
ABCABC = 258256
CACA = 25967
ABCDABCD = 260258
DADA = 26168
ABCDEndekein neuer Eintrag260

In der letzten Zeile ist das gesamte verbleibende Muster ABCD schon bekannt. Daher genügt sein Code 260. 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
      • Sonderfall nur bei der nächsten freien Codenummer zulassen
    • 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

9 Kapitel

Kapitel 1