Lempel-Ziv-Welch

Lempel-Ziv-Welch (LZW) ist ein universaler lossless Datenkompressionsalgorithmus, der von Abraham Lempel, Jacob Ziv und Terry Welch geschaffen ist. Es wurde von Welch 1984 als eine verbesserte Durchführung des LZ78 Algorithmus veröffentlicht, der von Lempel und Ziv 1978 veröffentlicht ist. Der Algorithmus ist einfach durchzuführen, und hat das Potenzial für den sehr hohen Durchfluss in Hardware-Durchführungen.

Algorithmus

Das in der 1984-Zeitung von Walisern beschriebene Drehbuch verschlüsselt Folgen von 8-Bit-Daten als 12-Bit-Codes der festen Länge. Die Codes von 0 bis 255 vertreten Folgen-Buchstaben 1, die aus dem entsprechenden 8-Bit-Charakter bestehen, und die Codes 256 bis 4095 werden in einem Wörterbuch für in den Daten gestoßene Folgen geschaffen, weil er verschlüsselt wird. In jeder Bühne in der Kompression werden Eingangsbytes in eine Folge gesammelt, bis der folgende Charakter eine Folge machen würde, für die es keinen Code noch im Wörterbuch gibt. Der Code für die Folge (ohne diesen Charakter) wird ausgestrahlt, und ein neuer Code (für die Folge mit diesem Charakter) wird zum Wörterbuch hinzugefügt.

Die Idee wurde an andere Situationen schnell angepasst. In einem Image, das auf einem Farbentisch zum Beispiel gestützt ist, ist das natürliche Charakter-Alphabet der Satz von Farbentabellenindizes, und in den 1980er Jahren, viele Images hatten kleine Farbentische (auf der Ordnung von 16 Farben). Für solch ein reduziertes Alphabet haben die vollen 12-Bit-Codes schlechte Kompression nachgegeben, wenn das Image nicht groß war, so wurde die Idee von einem Code der variablen Breite eingeführt: Codes fangen normalerweise um ein Bit breiter an als die Symbole, die verschlüsseln werden, und weil jede Codegröße, die Codebreite-Zunahmen durch 1 Bit, bis zu etwas vorgeschriebenes Maximum (normalerweise 12 Bit) verbraucht wird.

Weitere Verbesserungen schließen das Aufbewahren eines Codes ein, um anzuzeigen, dass der Codetisch (ein "klarer Code", normalerweise der erste Wert sofort nach den Werten für die individuellen Alphabet-Charaktere), und ein Code geklärt werden sollte, um das Ende von Daten (ein "Halt-Code", normalerweise ein größerer anzuzeigen, als der klare Code). Der klare Code erlaubt dem Tisch, wiederinitialisiert zu werden, nachdem es sich füllt, der die Verschlüsselung sich an sich ändernde Muster in den Eingangsdaten anpassen lässt. Kluger encoders kann die Kompressionsleistungsfähigkeit kontrollieren und den Tisch klären, wann auch immer der vorhandene Tisch nicht mehr den Eingang gut vergleicht.

Da die Codes gewissermaßen bestimmt durch die Daten hinzugefügt werden, ahmt der Decoder Gebäude des Tisches nach, weil es die resultierenden Codes sieht. Es ist kritisch, dass sich der encoder und Decoder einigen, welche Vielfalt von LZW verwendet wird: Die Größe des Alphabetes, der maximalen Codebreite, ob Verschlüsselung der variablen Breite, die anfängliche Codegröße verwendet wird, ob man die klaren Codes und Halt-Codes verwendet (und was schätzt, haben sie). Die meisten Formate, die LZW verwenden, bauen diese Information in die Format-Spezifizierung ein oder stellen ausführliche Felder für sie in einem Kompressionskopfball für die Daten zur Verfügung.

Verschlüsselung

Eine hohe Ansicht vom Verschlüsselungsalgorithmus wird hier gezeigt:

  1. Initialisieren Sie das Wörterbuch, um alle Schnuren der Länge ein zu enthalten.
  2. Finden Sie die längste Schnur W im Wörterbuch, das den aktuellen Eingang vergleicht.
  3. Strahlen Sie den Wörterbuch-Index für W zur Produktion aus und entfernen Sie W vom Eingang.
  4. Fügen Sie W hinzu, der vom folgenden Symbol im Eingang zum Wörterbuch gefolgt ist.
  5. Gehen Sie zum Schritt 2.

Ein Wörterbuch wird initialisiert, um die einzeln-Buchstaben Schnuren entsprechend allen möglichen Eingangscharakteren zu enthalten (und nichts anderes außer den klaren Codes und Halt-Codes, wenn sie verwendet werden). Der Algorithmus arbeitet durch die Abtastung durch die Eingangsschnur für nacheinander längere Teilketten, bis es denjenigen findet, der nicht im Wörterbuch ist. Wenn solch eine Schnur gefunden wird, der Index für die Schnur weniger wird der letzte Charakter (d. h., die längste Teilkette, die im Wörterbuch ist) aus dem Wörterbuch wiederbekommen und an die Produktion gesandt, und die neue Schnur (einschließlich des letzten Charakters) wird zum Wörterbuch mit dem folgenden verfügbaren Code hinzugefügt. Der letzte Eingangscharakter wird dann als der folgende Startpunkt verwendet, um für Teilketten zu scannen.

Auf diese Weise werden nacheinander längere Schnuren im Wörterbuch eingeschrieben und für die nachfolgende Verschlüsselung als einzelne Produktionswerte bereitgestellt. Die Algorithmus-Arbeiten am besten an Daten mit wiederholten Mustern, so werden die anfänglichen Teile einer Nachricht wenig Kompression sehen. Als die Nachricht jedoch wächst, neigt das Kompressionsverhältnis asymptotisch zum Maximum.

Entzifferung

Der Entzifferungsalgorithmus arbeitet durch das Lesen eines Werts vom verschlüsselten Eingang und outputting die entsprechende Schnur aus dem initialisierten Wörterbuch. Zur gleichen Zeit erhält es den folgenden Wert vom Eingang, und fügt zum Wörterbuch die Verkettung der Schnur gerade Produktion und der erste Charakter der erhaltenen Schnur durch die Entzifferung des folgenden Eingangswerts hinzu. Der Decoder geht dann zum folgenden Eingangswert weiter (der bereits in als der "folgende Wert" im vorherigen Pass gelesen wurde) und den Prozess wiederholt, bis es keinen Eingang mehr gibt, an dem Punkt der Endeingangswert ohne mehr Hinzufügungen zum Wörterbuch decodiert wird.

Auf diese Weise baut der Decoder ein Wörterbuch auf, das dazu identisch ist, das durch den encoder verwendet ist, und ihn verwendet, um nachfolgende Eingangswerte zu decodieren. So muss das volle Wörterbuch nicht mit den verschlüsselten Daten gesandt werden; gerade ist das anfängliche Wörterbuch, das die einzeln-Buchstaben Schnuren enthält, genügend (und wird normalerweise im Voraus innerhalb des encoder und Decoders definiert, anstatt mit den verschlüsselten Daten ausführlich gesandt zu werden.)

Codes der variablen Breite

Wenn Codes der variablen Breite verwendet werden, müssen der encoder und Decoder darauf achten, die Breite an denselben Punkten in den verschlüsselten Daten zu ändern, oder sie werden darüber nicht übereinstimmen, wo die Grenzen zwischen individuellen Codes im Strom fallen. In der Standardversion vergrößert der encoder die Breite von p bis p + 1, wenn auf eine Folge ω + s gestoßen wird, der nicht im Tisch ist (so dass ein Code dafür hinzugefügt werden muss), aber der folgende verfügbare Code im Tisch ist 2 (der erste Code, der p + 1 Bit verlangt). Der encoder strahlt den Code für ω an der Breite p aus (da dieser Code p + 1 Bit nicht verlangt), und dann die Codebreite vergrößert, so dass der folgende ausgestrahlte Code p + 1 Bit breit sein wird.

Der Decoder ist immer ein Code hinter dem encoder im Gebäude des Tisches so, wenn es den Code für ω sieht, wird es einen Zugang für den Code 2 &minus erzeugen; 1. Da das der Punkt ist, wo der encoder die Codebreite vergrößern wird, muss der Decoder die Breite hier ebenso vergrößern: Am Punkt, wo es den größten Code erzeugt, der p Bit einfügen wird.

Leider vergrößern einige frühe Durchführungen des Verschlüsselungsalgorithmus die Codebreite und strahlen dann ω an der neuen Breite statt der alten Breite aus, so dass zum Decoder es aussieht, dass die Breite einen Code zu früh ändert. Das wird "Frühe Änderung" genannt; es hat so viel Verwirrung verursacht, dass Adobe jetzt beide Versionen in PDF Dateien erlaubt, aber eine ausführliche Fahne in den Kopfball jedes LZW-komprimierten Stroms einschließt, um anzuzeigen, ob Frühe Änderung verwendet wird. Die meisten grafischen Dateiformate verwenden Frühe Änderung nicht.

Wenn der Tisch als Antwort auf einen klaren Code geklärt wird, ändern sowohl encoder als auch Decoder die Codebreite nach dem klaren Code zurück zur anfänglichen Codebreite, mit dem Code sofort im Anschluss an den klaren Code anfangend.

Verpackung der Ordnung

Da die Codes ausgestrahlt normalerweise auf Byte-Grenzen nicht fallen, müssen sich der encoder und Decoder einigen, wie Codes in Bytes gepackt sind. Die zwei übliche Methodik ist ("Am wenigsten bedeutendes Bit Zuerst") und MSB-zuerst ("Bedeutendstes Bit Zuerst") LSB-erst. In der LSB-ersten Verpackung wird der erste Code ausgerichtet, so dass das am wenigsten bedeutende Bit des Codes im am wenigsten bedeutenden Bit des ersten Strom-Bytes fällt, und wenn der Code mehr als 8 Bit hat, werden die hohen Ordnungsbit verlassen nach den am wenigsten bedeutenden Bit des folgenden Bytes ausgerichtet; weitere Codes sind mit dem LSB-Eintreten ins am wenigsten bedeutende Bit gepackt, das noch nicht im aktuellen Strom-Byte verwendet ist, in weitere Bytes als weitergehend, notwendig. Die MSB-erste Verpackung richtet den ersten Code aus, so dass sein bedeutendstes Bit im MSB des ersten Strom-Bytes mit der nach dem MSB des folgenden Bytes ausgerichteten Überschwemmung fällt; weitere Codes werden mit dem MSB-Eintreten ins bedeutendste im aktuellen Strom-Byte noch nicht verwendete Bit geschrieben.

GIF Dateien verwenden LSB-zuerst sich verpacken lassende Ordnung. ZANK-Dateien und PDF Dateien verwenden MSB-zuerst sich verpacken lassende Ordnung.

Beispiel

Das folgende Beispiel illustriert den LZW Algorithmus in der Handlung, den Status der Produktion und des Wörterbuches in jeder Bühne, sowohl in der Verschlüsselung als auch in Entzifferung der Daten zeigend. Dieses Beispiel ist gebaut worden, um angemessene Kompression auf einer sehr kurzen Nachricht zu geben. In echten Textdaten ist Wiederholung allgemein weniger ausgesprochen, so sind längere Eingangsströme normalerweise notwendig, bevor die Kompression Leistungsfähigkeit aufbaut.

Der plaintext, der (von einem Alphabet mit nur die Großbuchstaben) zu verschlüsseln ist, ist:

TOBEORNOTTOBEORTOBEORNOT#

# ist ein Anschreiber, der verwendet ist, um zu zeigen, dass das Ende der Nachricht erreicht worden ist. Es gibt so 26 Symbole im plaintext Alphabet (die 26 Großbuchstaben A durch Z), plus der Halt-Code #. Wir teilen willkürlich diese die Werte 1 bis 26 für die Briefe, und 0 für '#' zu. (Die meisten Geschmäcke nach LZW würden den Halt-Code nach dem Datenalphabet stellen, aber nichts im grundlegenden Algorithmus verlangt das. Der encoder und Decoder müssen nur abstimmen, was es schätzt, hat.)

Ein Computer wird diese als Schnuren von Bit machen. Fünf-Bit-Codes sind erforderlich, um genügend Kombinationen zu geben, um diesen Satz von 27 Werten zu umfassen. Das Wörterbuch wird mit diesen 27 Werten initialisiert. Als das Wörterbuch wächst, werden die Codes in Breite wachsen müssen, um die zusätzlichen Einträge anzupassen. Ein 5-Bit-Code gibt 2 = 32 mögliche Kombinationen von Bit so, wenn das 33. Wörterbuch-Wort geschaffen wird, wird der Algorithmus an diesem Punkt von 5-Bit-Schnuren bis 6-Bit-Schnuren umschalten müssen (für alle Codewerte, einschließlich derjenigen, die vorher Produktion mit nur fünf Bit waren). Bemerken Sie, dass da der Vollnullcode 00000 verwendet wird, und "0" etikettiert wird, wird der 33. Lexikoneintrag 32 etikettiert. (Vorher erzeugte Produktion wird durch die Codebreite-Änderung nicht betroffen, aber sobald ein 6-Bit-Wert im Wörterbuch erzeugt wird, konnte es denkbar der folgende ausgestrahlte Code, so die Breite für nachfolgende Produktionsverschiebungen zu 6 Bit sein, um das anzupassen.)

Das anfängliche Wörterbuch wird dann aus den folgenden Einträgen bestehen:

Verschlüsselung

Puffereingangscharaktere in einer Folge ω bis ω + folgender Charakter sind nicht im Wörterbuch. Strahlen Sie den Code für ω aus, und fügen Sie ω + folgender Charakter zum Wörterbuch hinzu. Fangen Sie an, wieder mit dem folgenden Charakter zu puffern.

Unverschlüsselte Länge = 25 Symbole × 5 Bit/Symbol = 125 Bit

Verschlüsselte Länge = (6 Codes × 5 Bit/Code) + (11 Codes × 6 Bit/Code) = 96 Bit.

Das Verwenden LZW hat 29 Bit aus 125 gespart, die Nachricht durch fast 22 % reduzierend. Wenn die Nachricht länger wäre, dann würden die Wörterbuch-Wörter beginnen, längere und längere Abteilungen des Textes zu vertreten, wiederholten Wörtern erlaubend, sehr kompakt gesandt zu werden.

Entzifferung

Um ein LZW-komprimiertes Archiv zu decodieren, muss man im Voraus das anfängliche Wörterbuch wissen verwendete aber zusätzliche Einträge können wieder aufgebaut werden, weil sie immer einfach Verkettungen von vorherigen Einträgen sind.

In jeder Bühne erhält der Decoder einen Code X; es schaut X im Tisch und den Produktionen die Folge χ es codiert, und es vermutet χ +? als der Zugang trug der encoder gerade bei - weil der encoder X für χ genau weil χ + ausstrahlte? war nicht im Tisch, und der encoder geht voran und fügt es hinzu. Aber wie ist der fehlende Brief? Es ist der erste Brief in der Folge, die durch den folgenden Code Z codiert ist, den der Decoder erhält. So schlägt der Decoder Z nach, decodiert ihn in die Folge ω und nimmt den ersten Brief z und heftet ihn auf das Ende von χ als der folgende Lexikoneintrag.

Das arbeitet, so lange die erhaltenen Codes im Wörterbuch des Decoders sind, so dass sie in Folgen decodiert werden können. Was geschieht, wenn der Decoder einen Code Z erhält, der ist noch nicht in seinem Wörterbuch? Da der Decoder immer gerade ein Code hinter dem encoder ist, kann Z im Wörterbuch des encoder nur sein, wenn der encoder es gerade erzeugt hat, als er den vorherigen Code X für χ ausgestrahlt hat. So codiert Z einen ω der ist χ +? und der Decoder kann den unbekannten Charakter wie folgt bestimmen:

  1. Der Decoder sieht X und dann Z.
  2. Es weiß X Codes die Folge χ und Z codiert eine unbekannte Folge ω.
  3. Es weiß, dass der encoder gerade Z hinzugefügt hat, um χ + etwas unbekannter Charakter, zu codieren
  4. und es weiß, dass der unbekannte Charakter der erste Brief z von ω ist.
  5. Aber der erste Brief von ω (= χ +?) muss dann auch der erste Brief von χ sein.
  6. So muss ω χ + x sein, wo x der erste Brief von χ ist.
  7. So rechnet der Decoder aus, was Z codiert, wenn auch es nicht im Tisch, ist
  8. und nach dem Empfang Z decodiert der Decoder es als χ + x, und fügt χ + x zum Tisch als der Wert von Z hinzu.

Diese Situation kommt vor, wann auch immer der encoder auf Eingang der Form cScSc stößt, wo c ein einzelner Charakter ist, ist S eine Schnur, und cS ist bereits im Wörterbuch, aber cSc ist nicht. Der encoder strahlt den Code für cS aus, einen neuen Code für cSc ins Wörterbuch stellend. Als nächstes sieht es cSc im Eingang (am zweiten c von cScSc anfangend), und strahlt den neuen Code aus, den es gerade eingefügt hat. Das Argument zeigt oben, dass, wann auch immer der Decoder einen Code nicht in seinem Wörterbuch erhält, die Situation wie das aussehen muss.

Obwohl der Eingang der Form cScSc unwahrscheinlich scheinen könnte, ist dieses Muster ziemlich üblich, wenn der Eingangsstrom durch die bedeutende Wiederholung charakterisiert wird. Insbesondere lange Schnuren eines einzelnen Charakters (die in den Arten von Images üblich sind, die LZW häufig verwendet wird, um zu verschlüsseln) erzeugen wiederholt Muster dieser Sorte.

Weiter das Codieren

Das einfache Schema, das oben beschrieben ist, konzentriert sich auf den LZW Algorithmus selbst. Viele Anwendungen wenden weitere Verschlüsselung auf die Folge von Produktionssymbolen an. Ein paketieren den codierten Strom als druckfähige Charaktere mit einer Form der zum Text binären Verschlüsselung; das wird die verschlüsselte Länge vergrößern und die Kompressionsfrequenz vermindern. Umgekehrt kann vergrößerte Kompression häufig mit einem anpassungsfähigen Wärmegewicht encoder erreicht werden. Solch ein Codierer schätzt den Wahrscheinlichkeitsvertrieb für den Wert des folgenden Symbols, das auf den beobachteten Frequenzen von Werten bis jetzt gestützt ist. Ein Standardwärmegewicht, das wie Huffman verschlüsselt, der codiert oder Arithmetik, die dann codiert, verwendet kürzere Codes für Werte mit höheren Wahrscheinlichkeiten.

Gebrauch

LZW Kompression ist die erste weit verwendete universale Datenkompressionsmethode auf Computern geworden. Eine große englische Textdatei kann normalerweise über LZW zur ungefähr Hälfte seiner ursprünglichen Größe zusammengepresst werden.

LZW wurde in der Programm-Kompresse des öffentlichen Gebiets verwendet, die ein mehr oder weniger normales Dienstprogramm in Systemen von Unix um 1986 geworden ist. Es ist von vielem Vertrieb seitdem verschwunden, sowohl weil es das LZW-Patent gebrochen hat, als auch weil erzeugte bessere Kompressionsverhältnisse von gzip mit dem LZ77-basierten Algorithmus DEFLATIONIEREN, aber bezüglich 2008 mindestens schließt FreeBSD sowohl Kompresse als auch Unkompresse als ein Teil des Vertriebs ein. Mehrere andere populäre Kompressionsdienstprogramme haben auch LZW verwendet, oder haben nah Methoden verbunden.

LZW ist sehr weit verwendet geworden, als es ein Teil des GIF Bildformats 1987 geworden ist. Es kann auch im ZANK und den PDF Dateien (fakultativ) verwendet werden. (Obwohl LZW in der Software von Adobe Acrobat verfügbar ist, Akrobat durch den Verzug-Gebrauch DEFLATIONIEREN für den grössten Teil des Textes und farbentabellenbasierte Bilddaten in PDF Dateien.)

Patente

Verschiedene Patente sind in den Vereinigten Staaten und anderen Ländern für LZW und ähnliche Algorithmen ausgegeben worden. LZ78 wurde durch von Lempel, Ziv bedeckt, Cohn und Eastman, haben Sperry Corporation, späterer Unisys Corporation, abgelegt am 10. August 1981 zugeteilt. Zwei US-Patente wurden für den LZW Algorithmus ausgegeben: Durch Victor S. Miller und Mark N. Wegman und zugeteilt IBM, ursprünglich abgelegt am 1. Juni 1983, und durch Waliser, die Sperry Corporation, späterer Unisys Corporation zugeteilt sind, abgelegt am 20. Juni 1983. Am 20. Juni 2003 ist dieses Patent auf dem LZW Algorithmus http://www.unisys.com/about__unisys/lzw abgelaufen. Alle Patente auf dem LZW Algorithmus weltweit sind auch abgelaufen (sieh Grafikaustausch Format#Unisys und LZW-Patent-Erzwingung).

Amerikanische Offene 4,558,302 haben viel negative Presse erhalten, nachdem LZW Kompression im GIF Bildformat verwendet wurde.

Varianten

  • LZMW (1985, durch V. Miller, M. Wegman) - Sucheingang für die längste Schnur bereits im Wörterbuch (das "aktuelle" Match); trägt die Verkettung des vorherigen Matchs mit dem aktuellen Match zum Wörterbuch bei. (Lexikoneinträge wachsen so schneller; aber dieses Schema ist viel mehr kompliziert, um durchzuführen.) Schlagen Miller und Wegman auch vor, niedrige Frequenzeinträge vom Wörterbuch zu löschen, wenn sich das Wörterbuch füllt.
  • LZAP (1988, durch James Storer) - Modifizierung von LZMW: Anstatt gerade die Verkettung des vorherigen Matchs mit dem aktuellen Match zum Wörterbuch hinzuzufügen, fügen Sie die Verkettungen des vorherigen Matchs mit jeder anfänglichen Teilkette des aktuellen Matchs hinzu. ("AP" tritt "für alle Präfixe" ein.) Zum Beispiel, wenn das vorherige Match "wiki" und aktuelles Match ist, ist "pedia", dann fügt der LZAP encoder 5 neue Folgen zum Wörterbuch hinzu: "Wikip", "wikipe", "wikiped", "wikipedi", und "wikipedia", wo der LZMW encoder nur eine Folge "wikipedia" hinzufügt. Das beseitigt etwas von der Kompliziertheit von LZMW, zum Preis des Hinzufügens von mehr Lexikoneinträgen.
  • LZWL ist eine Silbe-basierte Variante von LZW.

Siehe auch

  • LZ77 und LZ78
  • LZMA
  • Lempel Ziv Storer Szymanski
  • LZJB
  • Zusammenhang-Baum, der beschwert

Außenverbindungen


Rimsky-Korsakov (Begriffserklärung) / LZ77 und LZ78
Impressum & Datenschutz