<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Lempel-Ziv-Welch-Algorithmus</id>
	<title>Lempel-Ziv-Welch-Algorithmus - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Lempel-Ziv-Welch-Algorithmus"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Lempel-Ziv-Welch-Algorithmus&amp;action=history"/>
	<updated>2026-06-21T03:10:44Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Lempel-Ziv-Welch-Algorithmus&amp;diff=22655&amp;oldid=prev</id>
		<title>imported&gt;Matthäus Wander: /* Pseudocode */ Der gelistete Pseudocode wird durch die Quelle nicht belegt -&gt; kein Einzelnachweis</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Lempel-Ziv-Welch-Algorithmus&amp;diff=22655&amp;oldid=prev"/>
		<updated>2025-01-05T16:51:44Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Pseudocode: &lt;/span&gt; Der gelistete Pseudocode wird durch die Quelle nicht belegt -&amp;gt; kein Einzelnachweis&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;Lempel-Ziv-Welch-Algorithmus&amp;#039;&amp;#039;&amp;#039; (kurz &amp;#039;&amp;#039;&amp;#039;LZW-Algorithmus&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;LZW&amp;#039;&amp;#039; genannt) ist ein häufig bei Grafikformaten zur [[Datenkompression]], also zur Reduzierung der [[Daten]]menge, eingesetzter [[Algorithmus]]. Ein Großteil der Funktionsweise dieses Algorithmus wurde 1978 von [[Abraham Lempel]] und [[Jacob Ziv]] entwickelt und veröffentlicht ([[LZ78]]). Einige Detailverbesserungen wurden 1983 von [[Terry Welch|Terry A. Welch]] gemacht.&amp;lt;ref name=&amp;quot;USPAT4558302&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LZW ist ein [[verlustfreie Kompression|verlustfreies Komprimierungsverfahren]]. Es wird zum Beispiel im 1987 von [[CompuServe]]-Mitarbeitern entwickelten Bildformat [[GIF]] und optional in [[Tagged Image File Format|TIFF]] eingesetzt. Es eignet sich aber für jede Form von Daten, da das eingesetzte Wörterbuch erst zur Laufzeit generiert wird und so unabhängig vom Format ist. LZW ist wohl der bekannteste Vertreter der LZ-Familie.&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
LZW komprimiert mittels dynamischem [[Wörterbuchkompression|Wörterbuch]], in dem sich die am häufigsten vorkommenden [[Zeichenkette]]n, wie z.&amp;amp;nbsp;B. „ist“, „die“ und „ein“ ansammeln und dann nur noch unter einer Abkürzung angesprochen werden müssen.&lt;br /&gt;
Der Vorteil bei diesem Algorithmus liegt darin, dass kein zusätzliches Wörterbuch abgelegt werden muss und dass das Wörterbuch sich dynamisch an den jeweiligen Inhalt anpasst. Der Decoder ist in der Lage, es aus dem Datenstrom zu rekonstruieren.&lt;br /&gt;
Einträge im Wörterbuch werden üblicherweise über einen 12 [[Bit]] langen [[Indexstruktur|Index]] angesprochen. Es sind also maximal 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt; = 4096 Einträge möglich. Die Einträge mit dem Index 0 bis 255 werden mit den entsprechenden [[Byte]]s gefüllt, also Eintrag 0 mit 00&amp;lt;sub&amp;gt;hex&amp;lt;/sub&amp;gt;, Eintrag 2 mit 02&amp;lt;sub&amp;gt;hex&amp;lt;/sub&amp;gt;, … , Eintrag 255 mit FF&amp;lt;sub&amp;gt;hex&amp;lt;/sub&amp;gt; ([[Hexadezimalsystem]]). Nachfolgende Einträge, die zur [[Laufzeit (Informatik)|Laufzeit]] eingefügt werden, müssen also zwangsweise mit dem Index 256 beginnen. Neue Einträge werden generiert, indem der gefundene Eintrag plus dem nächsten Zeichen gespeichert wird. Wenn die gefundene Zeichenkette nur ein Zeichen lang ist, wird meistens nur dieses Zeichen gespeichert, da ein Verweis auf das entsprechende Element 12 Bit, das Zeichen selbst aber nur 8 Bit belegt. Die Unterscheidung, ob jetzt ein Verweis oder ein Symbol im [[Bitstrom]] kommt, kann per [[Flag (Informatik)|Flag]] gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Kompression ==&lt;br /&gt;
=== Algorithmus zur Kompression ===&lt;br /&gt;
Der Algorithmus wird zunächst einen 9-Bit-Code zurückgeben, später kann dieser Code bis zu 12 Bit breit werden, sofern das Alphabet nicht vorher durch Senden eines Clear-Codes gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Die untersten 256 Werte des Codieralphabets seien vordefiniert und entsprechen bei der Rückgabe sich selber. Der Algorithmus sucht nun das längste vorhandene Muster aus den Codes im Codieralphabet an der Eingabe und gibt den entsprechenden Wert zurück. Das wäre zu Beginn nur ein Byte, das durch einen 9-Bit-Code mit 0 als neuntes Bit ausgegeben wird. Darauf kettet er das nächste Zeichen der Eingabe an dieses Muster an und fügt das Resultat als nächsthöheren Eintrag ins Alphabet ein. Und so geht das die ganze Zeit weiter, bis das Alphabet vollläuft. Das Alphabet wird im Kompressor intern mitgeführt, aber nicht explizit gespeichert. Der Dekompressor baut es seinerseits auch aus der Eingabe auf. Er kann es rekonstruieren. Es gibt auch noch den K[Omega]K-Fall, bei dem das Muster aus dem Alphabet dem Dekompressor noch nicht bekannt ist. Aber er kann den Wert rekonstruieren.&lt;br /&gt;
&lt;br /&gt;
Zum Abspeichern einer Tabelle mit 4096 Mustern, deren Länge jeweils bis zu 4096 Zeichen beträgt, würde man im Allgemeinen 16&amp;amp;nbsp;[[Binärpräfix#Verhältnis binärer und dezimaler Präfixe|MiB]] benötigen. Jedoch beginnt jedes Muster der Länge &amp;#039;&amp;#039;n&amp;#039;&amp;#039; in der Tabelle mit einem Teilmuster der Länge &amp;#039;&amp;#039;n-1&amp;#039;&amp;#039;, welches sich ebenfalls in der Tabelle befindet. Damit kann man die gesamte Tabelle in zwei Feldern &amp;#039;&amp;#039;Prefix&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Suffix&amp;#039;&amp;#039; ablegen. Dabei enthält &amp;lt;math&amp;gt;{\rm Suffix}_k&amp;lt;/math&amp;gt; das letzte Zeichen des Musters &amp;#039;&amp;#039;k&amp;#039;&amp;#039; und &amp;lt;math&amp;gt;{\rm Prefix}_k&amp;lt;/math&amp;gt; den Index des Startmusters (also einen Verweis auf einen weiteren Eintrag in der Tabelle). Falls das Muster die Länge eins hat, wird &amp;lt;math&amp;gt;{\rm Prefix}_k&amp;lt;/math&amp;gt; auf eine Konstante &amp;#039;&amp;#039;&amp;amp;lt;leeres Muster&amp;amp;gt;&amp;#039;&amp;#039; gesetzt. Ein Eintrag in der Tabelle sei im Algorithmus dargestellt als Paar &amp;#039;&amp;#039;Muster = (Prefix, Suffix)&amp;#039;&amp;#039;. Der Algorithmus arbeitet dann wie folgt.&lt;br /&gt;
&lt;br /&gt;
      initialisiere Mustertabelle mit (&amp;amp;lt;leeres Muster&amp;amp;gt;+zeichen) für alle Zeichen&lt;br /&gt;
      muster := &amp;amp;lt;leeres Muster&amp;amp;gt;&lt;br /&gt;
      solange noch Zeichen verfügbar&lt;br /&gt;
            zeichen := lies nächstes Zeichen&lt;br /&gt;
            wenn (muster+zeichen) in Mustertabelle dann&lt;br /&gt;
                  muster := (muster+zeichen)&lt;br /&gt;
            sonst&lt;br /&gt;
                  füge (muster+zeichen) zur Mustertabelle hinzu&lt;br /&gt;
                  Ausgabe muster&lt;br /&gt;
                  muster := zeichen&lt;br /&gt;
      wenn muster nicht &amp;amp;lt;leeres Muster&amp;amp;gt; dann&lt;br /&gt;
            Ausgabe muster&lt;br /&gt;
&lt;br /&gt;
Dabei enthält die Variable &amp;#039;&amp;#039;muster&amp;#039;&amp;#039; den Index des entsprechenden Musters in der Tabelle und &amp;#039;&amp;#039;Ausgabe muster&amp;#039;&amp;#039; bedeutet, dass der Index des aktuellen Musters in die Ausgabedatei geschrieben wird. Bei der Anweisung &amp;#039;&amp;#039;muster := zeichen&amp;#039;&amp;#039; wird &amp;#039;&amp;#039;muster&amp;#039;&amp;#039; auf den Index des Eintrags &amp;#039;&amp;#039;(&amp;amp;lt;leeres Muster&amp;amp;gt;+zeichen)&amp;#039;&amp;#039; gesetzt. Da die Mustertabelle aber mit diesen Mustern initialisiert wurde, entspricht dieser Index genau dem Zeichen.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel zur Kompression ===&lt;br /&gt;
Ein Beispiel mit der Zeichenkette „LZWLZ78LZ77LZCLZMWLZAP“&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-class=&amp;quot;hintergrundfarbe6&amp;quot;&lt;br /&gt;
! Zeichenkette !! gefundener Eintrag !! Ausgabe !! neuer Eintrag&lt;br /&gt;
|----&lt;br /&gt;
|LZWLZ78LZ77LZCLZMWLZAP|| L || L || LZ (wird zu &amp;amp;lt;256&amp;amp;gt;) &lt;br /&gt;
|----&lt;br /&gt;
|ZWLZ78LZ77LZCLZMWLZAP|| Z || Z || ZW (wird zu &amp;amp;lt;257&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|WLZ78LZ77LZCLZMWLZAP|| W || W || WL (wird zu &amp;amp;lt;258&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|LZ78LZ77LZCLZMWLZAP|| LZ (= &amp;amp;lt;256&amp;amp;gt;) || &amp;amp;lt;256&amp;amp;gt; || LZ7 (wird zu &amp;amp;lt;259&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|78LZ77LZCLZMWLZAP|| 7 || 7 || 78 (wird zu &amp;amp;lt;260&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|8LZ77LZCLZMWLZAP|| 8 || 8 || 8L (wird zu &amp;amp;lt;261&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|LZ77LZCLZMWLZAP|| LZ7 (= &amp;amp;lt;259&amp;amp;gt;) || &amp;amp;lt;259&amp;amp;gt; || LZ77 (wird zu &amp;amp;lt;262&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|7LZCLZMWLZAP|| 7 || 7 || 7L (wird zu &amp;amp;lt;263&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|LZCLZMWLZAP|| LZ (= &amp;amp;lt;256&amp;amp;gt;) || &amp;amp;lt;256&amp;amp;gt; || LZC (wird zu &amp;amp;lt;264&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|CLZMWLZAP|| C || C || CL (wird zu &amp;amp;lt;265&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|LZMWLZAP|| LZ (= &amp;amp;lt;256&amp;amp;gt;) || &amp;amp;lt;256&amp;amp;gt; || LZM (wird zu &amp;amp;lt;266&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|MWLZAP|| M || M || MW (wird zu &amp;amp;lt;267&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|WLZAP|| WL (= &amp;amp;lt;258&amp;amp;gt;) || &amp;amp;lt;258&amp;amp;gt; || WLZ (wird zu &amp;amp;lt;268&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|ZAP|| Z || Z || ZA (wird zu &amp;amp;lt;269&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
|AP|| A || A || AP (wird zu &amp;amp;lt;270&amp;amp;gt;)&lt;br /&gt;
|----&lt;br /&gt;
| P|| P || P || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es entsteht also die Zeichenkette „L Z W &amp;amp;lt;256&amp;amp;gt; 7 8 &amp;amp;lt;259&amp;amp;gt; 7 &amp;amp;lt;256&amp;amp;gt; C &amp;amp;lt;256&amp;amp;gt; M &amp;amp;lt;258&amp;amp;gt; Z A P“ („Ausgabe“ von oben nach unten gelesen), die mit 16 12-Bit-Zeichen (entspricht 24 8-Bit-Zeichen) anstatt ursprünglich 22 8-Bit-Zeichen dieselbe Information enthalten.&lt;br /&gt;
&lt;br /&gt;
== Dekompression ==&lt;br /&gt;
=== Algorithmus der Dekompression ===&lt;br /&gt;
Zur Dekompression kann aus den Codewörtern der Reihe nach genau die gleiche Mustertabelle erzeugt werden, da bei der Kompression immer nur das alte Muster und nicht das neue Muster mit dem nächsten Zeichen ausgegeben wurde. Bei der Komprimierung beginnt jedes Muster mit dem letzten Zeichen des vorherigen zur Tabelle hinzugefügten Musters. Umgekehrt ist bei der Dekomprimierung das letzte Zeichen des Musters, welches zur Tabelle hinzugefügt werden muss, gleich dem ersten Zeichen des aktuellen Musters, welches ausgegeben werden soll.&lt;br /&gt;
&lt;br /&gt;
Problematisch wird es, wenn das auszugebende Muster noch nicht in der Tabelle eingetragen ist. Dann kann man auch nicht in der Tabelle nach dem ersten Zeichen dieses Musters suchen. Das passiert aber nur, falls ein Muster mehrmals direkt hintereinander auftritt. Dann gilt: Das neue Muster ist das vorherige Muster + erstes Zeichen des vorherigen Musters.&lt;br /&gt;
&lt;br /&gt;
      INITIALISIERE Mustertabelle MIT (&amp;amp;lt;leeres Muster&amp;amp;gt;,Zeichen) FÜR ALLE Zeichen&lt;br /&gt;
      last := lies_ersten_Code()&lt;br /&gt;
      Ausgabe(Muster VON last)&lt;br /&gt;
      SOLANGE NOCH Codes_verfügbar() WIEDERHOLE:&lt;br /&gt;
         next := lies_nächsten_Code()&lt;br /&gt;
         WENN next IN Mustertabelle DANN:&lt;br /&gt;
            FÜGE ( (Muster VON last), erstes_Zeichen_von(Muster VON next)) ZUR Mustertabelle HINZU&lt;br /&gt;
         SONST:&lt;br /&gt;
            FÜGE ( (Muster VON last), erstes_Zeichen_von(Muster VON last)) ZUR Mustertabelle HINZU&lt;br /&gt;
         Ausgabe(Muster VON next)&lt;br /&gt;
         last := next&lt;br /&gt;
&lt;br /&gt;
=== Beispiel zur Dekompression ===&lt;br /&gt;
Die Zeichen werden der Reihe nach eingelesen. Ein Zeichen ergibt mit dem vorhergehenden Zeichen, bzw. Wörterbucheintrag einen neuen Eintrag in das Wörterbuch. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-class=&amp;quot;hintergrundfarbe6&amp;quot;&lt;br /&gt;
! aktuelles Zeichen || erster Buchstabe || Neuer Eintrag || Ausgabe&lt;br /&gt;
|----&lt;br /&gt;
| L || - || - || L&lt;br /&gt;
|----&lt;br /&gt;
| Z || Z || LZ (=256)|| Z&lt;br /&gt;
|----&lt;br /&gt;
| W || W || ZW (=257)|| W&lt;br /&gt;
|----&lt;br /&gt;
| &amp;amp;lt;256&amp;amp;gt; || L || WL (=258)|| LZ&lt;br /&gt;
|----&lt;br /&gt;
| 7 || 7 || LZ7 (=259)|| 7&lt;br /&gt;
|----&lt;br /&gt;
| 8 || 8 || 78 (=260)|| 8&lt;br /&gt;
|----&lt;br /&gt;
| &amp;amp;lt;259&amp;amp;gt; || L || 8L (=261) || LZ7&lt;br /&gt;
|----&lt;br /&gt;
| 7 || 7 || LZ77 (=262)|| 7&lt;br /&gt;
|----&lt;br /&gt;
| &amp;amp;lt;256&amp;amp;gt; || L || 7L (=263)|| LZ&lt;br /&gt;
|----&lt;br /&gt;
| C || C || LZC (=264)|| C&lt;br /&gt;
|----&lt;br /&gt;
| &amp;amp;lt;256&amp;amp;gt; || L || CL (=265) || LZ&lt;br /&gt;
|----&lt;br /&gt;
| M || M || LZM (=266) || M&lt;br /&gt;
|----&lt;br /&gt;
| &amp;amp;lt;258&amp;amp;gt; || W || MW (=267) || WL&lt;br /&gt;
|----&lt;br /&gt;
| Z || Z || WLZ (=268) || Z&lt;br /&gt;
|----&lt;br /&gt;
| A || A || ZA (=269) || A&lt;br /&gt;
|----&lt;br /&gt;
| P || P || AP (=270) || P&lt;br /&gt;
|}&lt;br /&gt;
„Ausgabe“ von oben nach unten gelesen ergibt wieder die vorher codierte Zeichenkette „LZWLZ78LZ77LZCLZMWLZAP“.&lt;br /&gt;
&lt;br /&gt;
== Pseudocode ==&lt;br /&gt;
Das folgende Beispiel in [[Pseudocode]] zeigt [[Funktion (Programmierung)|Funktionen]], die den Lempel-Ziv-Welch-Algorithmus für die [[Datenkompression|Kompression]] und Dekompression verwenden.&lt;br /&gt;
 /**&lt;br /&gt;
  * symbolDictionary // Diese Map ordnet jedem Symbol den entsprechenden Zahlenwert von 0 bis 255 zu&lt;br /&gt;
  * lzwCode // Vektor für den codierten Text&lt;br /&gt;
  */&lt;br /&gt;
  // Diese Funktion erzeugt den codierten Text mit dem Lempel-Ziv-Welch-Algorithmus&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;function&amp;#039;&amp;#039;&amp;#039; encodeWithLZW(inputText)&lt;br /&gt;
  {&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; i := 0 &amp;#039;&amp;#039;&amp;#039;to&amp;#039;&amp;#039;&amp;#039; 255 &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
    {&lt;br /&gt;
        symbolDictionary[symbolText] := i&lt;br /&gt;
    }&lt;br /&gt;
    code := 256&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; i := 0 &amp;#039;&amp;#039;&amp;#039;to&amp;#039;&amp;#039;&amp;#039; inputText.length() - 1 &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
    {&lt;br /&gt;
        c := &amp;quot;&amp;quot; // Variable für die aktuelle Zeichenkette&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (i ist nicht das Ende des eingegebenen Texts)&lt;br /&gt;
        {&lt;br /&gt;
            c := concat(c, inputText[i + 1])&lt;br /&gt;
        }&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (das Wort concat(p, c) ist im Dictionary enthalten)&lt;br /&gt;
        {&lt;br /&gt;
            p := concat(p, c)&lt;br /&gt;
        }&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;else&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
        {&lt;br /&gt;
            lzwCode := concat(lzwCode, symbolDictionary[p]) // Codewort dem codierten Text hinzufügen&lt;br /&gt;
            symbolDictionary[concat(p, c)] := code // Wort concat(p, c) dem Dictionary hinzufügen&lt;br /&gt;
            code := code + 1&lt;br /&gt;
            p := c&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    lzwCode := concat(lzwCode, symbolDictionary[p]) // Codewort dem codierten Text hinzufügen&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; lzwCode&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * lzwCode // Vektor für den codierten Text&lt;br /&gt;
  * symbolDictionary // Diese Map ordnet jedem Symbol den entsprechenden Zahlenwert von 0 bis 255 zu&lt;br /&gt;
  */&lt;br /&gt;
  // Diese Funktion decodiert den codierten Text mit dem Lempel-Ziv-Welch-Algorithmus&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;function&amp;#039;&amp;#039;&amp;#039; decodeWithLZW(lzwCode)&lt;br /&gt;
  {&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; i := 0 &amp;#039;&amp;#039;&amp;#039;to&amp;#039;&amp;#039;&amp;#039; 255 &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
    {&lt;br /&gt;
        symbolDictionary[i] := symbolText&lt;br /&gt;
    }&lt;br /&gt;
    previousCodeWord := lzwCode[0]&lt;br /&gt;
    symbolText := symbolDictionary[previousCodeWord] // Variable für die aktuellen decodierte Zeichenkette&lt;br /&gt;
    decodedText := symbolText&lt;br /&gt;
    count := 256 // Zähler für die hinzugefügten Schlüssel des Dictionary&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; i := 0 &amp;#039;&amp;#039;&amp;#039;to&amp;#039;&amp;#039;&amp;#039; lzwCode.length() - 1 &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
    {&lt;br /&gt;
        codeWord := lzwCode[i + 1]; // Variable für das aktuelle Codewort&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; (das aktuelle Codewort ist nicht im Dictionary enthalten)&lt;br /&gt;
        {&lt;br /&gt;
            symbolText := symbolDictionary[previousCodeWord]&lt;br /&gt;
            symbolText := concat(symbolText, symbolText[0]) // Symbol der Zeichenkette hinzufügen&lt;br /&gt;
        }&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;else&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
        {&lt;br /&gt;
            symbolText := symbolDictionary[codeWord]&lt;br /&gt;
        }&lt;br /&gt;
        decodedText := concat(decodedText, symbolText) // Aktuelle decodierte Zeichenkette dem decodierten Text hinzufügen&lt;br /&gt;
        symbolDictionary[count] := concat(symbolDictionary[previousCodeWord], symbolText[0]) // Zahlenwert count dem Dictionary hinzufügen&lt;br /&gt;
        count := count + 1&lt;br /&gt;
        previousCodeWord := codeWord // Variable für das vorige Codewort setzen&lt;br /&gt;
    }&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039; decodedText&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Varianten ==&lt;br /&gt;
Der [[LZ78]]-[[Algorithmus]] arbeitet ähnlich, startet jedoch mit einem leeren Wörterbuch. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;LZC&amp;#039;&amp;#039; ist nur eine leichte Abwandlung von LZW. Die Indexgröße und damit die Wörterbuchgröße ist variabel, startet bei 9 Bit und kann bis zu einer vom Nutzer festgelegten Größe wachsen. Es kann eine bis zu 7 % bessere Kompression erwartet werden.&lt;br /&gt;
&lt;br /&gt;
[[LZMW]] (von [[Victor S. Miller]], [[Mark N. Wegman]] 1985) unterscheidet sich dadurch, dass anstatt nur jeweils ein Zeichen an eine Zeichenkette im Wörterbuch anzuhängen, jede Zeichenkette mit dem längsten bekannten String, der in der nachfolgenden Eingabe unmittelbar im Anschluss gefunden werden kann, angehängt werden kann. Dieses ist bei speziellen Daten recht praktisch (z.&amp;amp;nbsp;B. eine [[Datei]], welche aus 10.000 „a“s besteht), LZW kommt allerdings mit allgemeinen Daten besser zurecht.&lt;br /&gt;
&lt;br /&gt;
== Patente ==&lt;br /&gt;
Für LZW und ähnliche Algorithmen wurden verschiedene [[Patent]]e in den [[USA]] und anderen Ländern ausgestellt. LZ78 wurde durch das am 10. August 1981 eingereichte und am 7. August 1984 gewährte US-Patent 4.464.650 der [[Sperry Corporation]] (später zu [[Unisys]] fusioniert) abgedeckt, in dem Lempel, Ziv, Cohn und Eastman als [[Erfinder]] eingetragen sind.&amp;lt;ref name=&amp;quot;USPAT4464650&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwei US-Patente wurden für den LZW-Algorithmus ausgestellt: Nr. 4.814.746 von [[Victor S. Miller]] und [[Mark N. Wegman]] für [[IBM]], eingereicht am 1. Juni 1983, sowie Nr. 4.558.302 von Welch für die Sperry Corporation, später Unisys Corporation, eingereicht am 20. Juni 1983.&amp;lt;ref name=&amp;quot;USPAT4814746&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;USPAT4558302&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das US-Patent 4.558.302 verursachte die größte Kontroverse. Eine der am weitesten verbreiteten Anwendungen für LZW war das in den 1990er Jahren für [[Webseite]]n immer populärer werdende [[Graphics Interchange Format|GIF-Format]] für Bilder. Unisys hatte zwar bereits seit 1987 [[Lizenz]]-Gebühren für die LZW-Verwendung in [[Hardware]] und hardwarenaher [[Software]] verlangt, die [[tantieme]]nfreie Nutzung des LZW-Algorithmus jedoch gestattet, während GIF sich neben [[JPEG File Interchange Format|JFIF]] zu einem Standard-Format entwickelte. Im Dezember 1994 begann Unisys jedoch mit CompuServe Lizenzgebühren von Entwicklern kommerzieller Software, die das [[Graphics Interchange Format|GIF-Format]] lesen und schreiben konnte, zu verlangen und dehnte dieses 1999 auch auf freie Software aus. Diese Verwertung als [[Softwarepatent]] rief in Entwickler- und Anwenderkreisen weltweit Empörung hervor und motivierte die rasche Entwicklung des ausschließlich auf frei verfügbarem Code basierenden und leistungsfähigeren Grafikdateiformats [[Portable Network Graphics|PNG]].&lt;br /&gt;
&lt;br /&gt;
Viele Rechtsexperten kamen zum Schluss, dass das Patent solche Geräte nicht abdecke, die LZW-Daten zwar dekomprimieren, aber nicht komprimieren können. Aus diesem Grund kann das weit verbreitete Programm [[gzip]] Dateiarchive im Z-Format zwar lesen, aber nicht schreiben.&lt;br /&gt;
&lt;br /&gt;
Das US-Patent 4.558.302 lief am 20. Juni 2003 nach 20 Jahren aus. Die entsprechenden europäischen, kanadischen und japanischen Patente folgten im Juni 2004.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Rosetta Code: [https://rosettacode.org/wiki/LZW_compression LZW compression]&lt;br /&gt;
* SourceForge: [[sourceforge:projects/sharplzw/|SharpLZW - Open Source Implementation]]&lt;br /&gt;
* apponic: [https://lzw-compression-decompression.apponic.com/ LZW Compression/Decompression]&lt;br /&gt;
* MathWorks: [https://de.mathworks.com/matlabcentral/fileexchange/4899-lzw-compression-algorithm?s_tid=FX_rc3_behav LZW Compression Algorithm]&lt;br /&gt;
* {{Webarchiv | url=http://www.ufg.ac.at/zid/public_html/funk/medientechnik/material/LZW.html | wayback=20030331214931 | text=Lempel-Ziv-Welch-Kompression}}&lt;br /&gt;
* [http://lzw.info/ The GIF Controversy: A Software Developer&amp;#039;s Perspective] (englisch)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;USPAT4464650&amp;quot;&amp;gt;&lt;br /&gt;
{{Patent&lt;br /&gt;
 | Land = US&lt;br /&gt;
 | V-Nr = 4464650&lt;br /&gt;
 | Typ = Patent&lt;br /&gt;
 | Titel = Apparatus and method for compressing data signals and restoring the compressed data signals&lt;br /&gt;
 | A-Datum = 1981-08-10&lt;br /&gt;
 | V-Datum = 1984-08-07 &lt;br /&gt;
 | Erfinder = Lempel, Ziv, Cohn und Eastman &lt;br /&gt;
 | Anmelder = Sperry Corporation &lt;br /&gt;
 | Kommentar = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;USPAT4814746&amp;quot;&amp;gt;&lt;br /&gt;
{{Patent&lt;br /&gt;
 | Land = US&lt;br /&gt;
 | V-Nr = 4814746&lt;br /&gt;
 | Typ = Patent&lt;br /&gt;
 | Titel = Data compression method&lt;br /&gt;
 | A-Datum = 1986-08-11&lt;br /&gt;
 | V-Datum = 1989-03-21&lt;br /&gt;
 | Erfinder = Victor S. Miller, Mark N. Wegman&lt;br /&gt;
 | Anmelder = IBM&lt;br /&gt;
 | Kommentar = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;USPAT4558302&amp;quot;&amp;gt;&lt;br /&gt;
{{Patent&lt;br /&gt;
 | Land = US&lt;br /&gt;
 | V-Nr = 4558302&lt;br /&gt;
 | Typ = Patent&lt;br /&gt;
 | Titel = High speed data compression and decompression apparatus and method&lt;br /&gt;
 | A-Datum = 1983-06-20&lt;br /&gt;
 | V-Datum = 1985-12-10&lt;br /&gt;
 | Erfinder = Terry Welch&lt;br /&gt;
 | Anmelder = Sperry Corporation&lt;br /&gt;
 | Kommentar = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Kompressionsalgorithmus]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Matthäus Wander</name></author>
	</entry>
</feed>