Aufgaben:Aufgabe 2.3: Zur LZ78-Komprimierung: Unterschied zwischen den Versionen
Zeile 82: | Zeile 82: | ||
===Musterlösung=== | ===Musterlösung=== | ||
{{ML-Kopf}} | {{ML-Kopf}} | ||
− | '''(1)''' Zutreffend für den LZ78–Algorithmus ist <u>Aussage 1</u> | + | '''(1)''' Zutreffend für den LZ78–Algorithmus ist <u>Aussage 1</u>: |
+ | *Die Vorbelegung gemäß Aussage 2 gilt dagegen für den LZW–Algorithmus, der 1983 gemeinsam mit Terry Welch veröffentlicht wurde. | ||
+ | |||
'''(2)''' <b>ε</b> bezeichnet das leere Zeichen. Da <b>ε</b> + <b>B</b> = <b>B</b> ergibt, sind die <u>Aussagen 1 und 2</u> richtig. Aussage 3 trifft wieder für die LZW–Komprimierung zu. | '''(2)''' <b>ε</b> bezeichnet das leere Zeichen. Da <b>ε</b> + <b>B</b> = <b>B</b> ergibt, sind die <u>Aussagen 1 und 2</u> richtig. Aussage 3 trifft wieder für die LZW–Komprimierung zu. | ||
+ | |||
'''(3)''' Hier treffen <u>beide Aussagen</u> zu. | '''(3)''' Hier treffen <u>beide Aussagen</u> zu. | ||
+ | |||
'''(4)''' Richtig sind die <u>Aussagen 2 und 4</u>: | '''(4)''' Richtig sind die <u>Aussagen 2 und 4</u>: | ||
− | *Im Wörterbuch wird unter dem Index | + | *Im Wörterbuch wird unter dem Index $I = 1$ das Zeichen <b>B</b> gefunden. |
− | *Das nächste Zeichen <b>A</b> der Eingangsfolge wird angehängt: (1, | + | *Das nächste Zeichen <b>A</b> der Eingangsfolge wird angehängt: <b>(1, A)</b>. |
− | *Die Aussage 3 kann schon deshalb nicht stimmen, da | + | *Die Aussage 3 kann schon deshalb nicht stimmen, da $Z$ nur ein Zeichen sein kann und keine Zeichenfolge. |
− | :[[Datei:Inf_A_2_3f_version2.png|right|LZ78–Codierung von <b>BARBARA–BAR</b>]] | + | |
+ | :[[Datei:Inf_A_2_3f_version2.png|right|frame|LZ78–Codierung von <b>BARBARA–BAR</b>]] | ||
'''(5)''' Der gesamte Codiervorgang ist in einer Tabelle zusammengefasst. Man erkennt: | '''(5)''' Der gesamte Codiervorgang ist in einer Tabelle zusammengefasst. Man erkennt: | ||
− | * Zu jedem Zeitpunkt | + | * Zu jedem Zeitpunkt $i$ wird die bearbeitete Zeichenfolge in das Wörterbuch eingetragen. |
− | * Zum Zeitpunkt | + | * Zum Zeitpunkt $\underline{i=7}$ ist der Codiervorgang abgeschlossen. |
− | + | ||
'''(6)''' Stellt man alle Indizes mit drei Bit dar und die vier Zeichen (Character) mit je zwei Bit, so kommt man zu folgenden Ergebnissen: | '''(6)''' Stellt man alle Indizes mit drei Bit dar und die vier Zeichen (Character) mit je zwei Bit, so kommt man zu folgenden Ergebnissen: | ||
− | * ohne Codierung: $N = 11 \cdot 2 \hspace{0.15cm}\underline {= 22 \, \rm Bit}$, | + | * ohne Codierung: $N = 11 \cdot 2 \hspace{0.15cm}\underline {= 22 \, \rm Bit}$, |
− | * mit LZ78–Codierung: $N = 7 \cdot (3+2) \hspace{0.15cm}\underline {= 35 \, \rm Bit}$. | + | * mit LZ78–Codierung: $N = 7 \cdot (3+2) \hspace{0.15cm}\underline {= 35 \, \rm Bit}$. |
Daran erkennt man: | Daran erkennt man: |
Version vom 24. September 2018, 13:17 Uhr
Im Gegensatz zur Entropiecodierung nach Huffman oder nach Shannon, bei der man die Quellenstatistik (möglichst genau) kennen muss, sind solche Einschränkungen bei den von Abraham Lempel und Jacob Ziv entwickelten Komprimierungsverfahren nicht gegeben. Man spricht von universeller Quellencodierung.
Wir betrachten in dieser Aufgabe die 1978 erstmals veröffentlichte Variante [LZ78]. Codiert werden soll der String BARBARA–BAR.
- Das Verfahren LZ78 arbeitet mit einem globalen Wörterbuch, das zu Beginn nur mit einem leeren Zeichen $(\varepsilon)$ unter dem Index $I = 0$ gefüllt ist. Dadurch unterscheidet sich „LZ78” von seinem Vorgänger „LZ77” (mit lokalem Wörterbuch) und auch von seinem Nachfolger „LZW” (Wörterbuch ist mit den möglichen Zeichen vorbelegt).
- Wird ein Zeichen oder ein Wortfragment (mehrere Zeichen) des Eingabestrings im Wörterbuch gefunden, so wird der Index $I_0$ dieses Eintrags zusammen mit dem nächsten Eingangszeichen $Z$ ausgegeben. In jedem Schritt $i$ lautet also die Ausgabe: $(I_0, \ Z)$.
- Anschließend wird der neue String unter dem nächsten freien Index $I_{\rm neu}$ ins Wörterbuch eingetragen.
- Betrachtet man das Wörterbuch als ein Feld $W[\hspace{0.05cm}I\hspace{0.05cm}]$ mit $I ≥ 0$, bei dem ein jedes Element eine Zeichenkette beliebiger Länge enthält, so gilt mit der Character–Variablen $Z$:
- $$W [\hspace{0.05cm}I_{\rm neu}\hspace{0.05cm}] = W[\hspace{0.05cm}I_0\hspace{0.05cm}] + Z \hspace{0.05cm}. $$
Zur Verdeutlichung ein einfaches Beispiel:
- Zu einem gegebenen Zeitpunkt ist das Wörterbuch bis zum Index $I_{\rm akt }= 20$ gefüllt.
- Zur Codierung steht Handy an. Im Wörterbuch findet man unter dem Index $I = 11$ den Eintrag Ha und unter dem Index $I = 16$ den Eintrag Han.
- Somit lautet die aktuelle Coderausgabe $(I_0, Z) = (16,$ d$)$ und ins Wörterbuch wird als neue Phrase eingetragen: $W(21) =$ Hand.
- Nun liegt der String y zur Codierung an. Findet man hierfür keinen passenden Eintrag, so wird $(0,$ y$)$ ausgegeben und ins Wörterbuch neu eingetragen: $W(22) = $ ε + y $=$ y .
Für die Teilaufgabe (6) können Sie von folgenden Voraussetzungen ausgehen:
- Die Dezimalzahl $I$ (Index) wird durch drei Bit binär dargestellt.
- Das Zeichen $Z ∈ \{$A, B, R, –$ \}$ wird mit jeweils zwei Bit binär codiert.
Hinweise:
- Die Aufgabe gehört zum Kapitel Komprimierung nach Lempel, Ziv und Welch.
- Insbesondere wird auf die Seite Die Lempel-Ziv-Variante LZ78 Bezug genommen.
- Die Originalliteratur [LZ78] zu diesem Verfahren lautet: Ziv, J.; Lempel, A.: Compression of Individual Sequences via Variable-Rate Coding. In: IEEE Transactions on Information Theory, no. 5, vol. 24, 1978, p. 530–536.
- Die Zusatzaufgabe 2.3Z sowie die Aufgabe 2.4 behandeln andere Lempel–Ziv-Verfahren in ähnlicher Weise.
Fragebogen
Musterlösung
- Die Vorbelegung gemäß Aussage 2 gilt dagegen für den LZW–Algorithmus, der 1983 gemeinsam mit Terry Welch veröffentlicht wurde.
(2) ε bezeichnet das leere Zeichen. Da ε + B = B ergibt, sind die Aussagen 1 und 2 richtig. Aussage 3 trifft wieder für die LZW–Komprimierung zu.
(3) Hier treffen beide Aussagen zu.
(4) Richtig sind die Aussagen 2 und 4:
- Im Wörterbuch wird unter dem Index $I = 1$ das Zeichen B gefunden.
- Das nächste Zeichen A der Eingangsfolge wird angehängt: (1, A).
- Die Aussage 3 kann schon deshalb nicht stimmen, da $Z$ nur ein Zeichen sein kann und keine Zeichenfolge.
(5) Der gesamte Codiervorgang ist in einer Tabelle zusammengefasst. Man erkennt:
- Zu jedem Zeitpunkt $i$ wird die bearbeitete Zeichenfolge in das Wörterbuch eingetragen.
- Zum Zeitpunkt $\underline{i=7}$ ist der Codiervorgang abgeschlossen.
(6) Stellt man alle Indizes mit drei Bit dar und die vier Zeichen (Character) mit je zwei Bit, so kommt man zu folgenden Ergebnissen:
- ohne Codierung: $N = 11 \cdot 2 \hspace{0.15cm}\underline {= 22 \, \rm Bit}$,
- mit LZ78–Codierung: $N = 7 \cdot (3+2) \hspace{0.15cm}\underline {= 35 \, \rm Bit}$.
Daran erkennt man:
- Eine jede LZ–Komprimierung macht erst bei einer größeren Datei Sinn, auch dann, wenn man glaubt, dass ein Text wie BARBARA–BAR dem LZ78–Algorithmus entgegenkommt.
- Mit variabler Bitanzahl für den Index entsprechend der Aufgabe 2.4 würde sich für dieses LZ78-Beispiel ergeben:
- $$N = 1 \cdot 3 + 2 \cdot 4 + 4 \cdot 5 = 31 \,{\rm Bit}\hspace{0.05cm}.$$