Kapitel 3 Wörterbuchmethode ud Lempel-Ziv-Codierug I diesem Abschitt lere wir allgemei Wörterbuchmethode zur Kompressio ud isbesodere die Lempel-Ziv (LZ))-Codierug kee. Wörterbuchmethode sid ei eifaches allgemeies Verfahre zur Coderug. Es wird häufig als Teilalgorithmus i Kompressiosverfahre eigesetzt. LZ- Codierug ist ei so geates dyamisches Wörterbuchverfahre. Im Gegesatz zu statische Wörterbuchverfahre, die ei festes, vor der Kompressio festgelegtes Wörterbuch beutze, wird bei der LZ-Codierug das Wörterbuch dyamisch aus de zu komprimierede Date erstellt. Wir werde zeige, dass die LZ-Codierug ei asymptotisch optimales Verfahre ist. Der große Vorteil der LZ-Codierug gegeüber de adere Verfahre, die wir bislag kee gelert habe, ist, dass bei der LZ-Codierug die Wahrscheilichkeitsverteilug der Quelle icht bekat sei muss. LZ- Codierug wird i viele Textkompressiosverfahre wie gzip ud compress eigesetzt. 3.1 Statische Wörterbuchverfahre I diesem Abschitt werde wir beispielhaft ei statisches Wörterbuchverfahre kee lere. Bei Wörterbuchverfahre werde häufig vorkommede Folge i eiem Wörterbuch gespeichert. Folge im Wörterbuch werde da durch de Idex des etsprechede Eitrags codiert. Folge, die icht im Wörterbuch stehe, werde durch sich selbst codiert. Um zwische ucodierte Folge ud Wörtebuchidizes uterscheide zu köe, ka da ei Flag beutzt werde. 55
Betrachte wir das Quellalphabet A = {0, 1} b mit eier Verteilug, die durch eie Verteilug p(0) = p 0, p(1) = p 1 auf {0, 1} iduziert wird. Wir ehme a, dass wir ei Wörterbuch W mit 2 c, c < b, Eiträge beutze dürfe. De i-te Eitrag im Wörterbuch bezeiche wir mit W i, i = 0,..., 2 c 1. Gemäß der Wahrscheilichkeitsverteilug auf A bestimmt wir u die 2 c wahrscheilichste Folge i A. Diese 2 c Folge speicher wir i userem Wörterbuch, d.h., jeder dieser Folge wird ei Idex i zugeordet ud im Eitrag W i des Wörterbuchs steht da die etsprechede Folge. Um u Folge a A zu codiere, gehe wir folgedermaße vor. Ist a = W i für ei i = 0,..., 2 c 1, liegt also a im Wörterbuch W, so wird a durch 0(i) 2 codiert. Dabei bezeichet (i) 2 die Biärdarstellug vo i. Um techische Schwierigkeite zu vermeide, stelle wir die Biärdarstellluge immer mit c Bits dar. Wir beutze also, falls otwedig, führede Nulle. Ist higege eie Folge a icht im Wörterbuch ethalte, so codiere wir a durch 1a. Das Bit, das wir i beide Codierugsmöglichkeite dem Wörterbuchidex bzw. der eigetliche Folge vorastelle, ist das obe erwähte Flag. Ma überlegt sich leicht, dass die so defiierte Codierug eie Präfix-Code liefert. Um die erwartete Codewortläge dieses Codes zu bereche, sei p w die Summe der Folge i A, die im Wörterbuch ethalte sid. Folge, die im Wörterbuch sid, werde durch Folge der Läge 1 + c codiert. Folge, die icht im Wörterbuch sid, werde durch Folge der Läge 1 + b codiert. Die erwartete Codewortläge ist damit gegebe durch p w (c + 1) + (1 p w )(b + 1) = b + 1 + p w (c b). Damit diese erwartetet Codewortläge kleier ist als die Läge der ucodierte Folge, muss gelte 1 + p w (c b) < 0 p w > 1 b c. Nur we die letzte Ugleichug erfüllt ist, wird also durch die beschriebee Codierug eie Kompressio der Date erreicht. Betrachte wir de Fall b = 5 ud c = 2. Die Verteilug auf {0, 1} sei gegebe durch p(0) = 3 4, p(1) = 1 4. Die größte Wahrscheilichkeit i {0, 1}5 hat da die Folge 0 5, die Wahrscheilichkeit 243 1024 besitzt. Die Folge 05 wird auf jede Fall is Wörterbuch aufgeomme. Wir setze W 0 = 0 5. Die Folge mit der ächst größere Wahrscheilichkeit sid die Folge bestehed aus eier 1 ud vier 0. Hiervo gibt es füf. Wir köe i das Wörterbuch ur och drei dieser Worte aufehme. Wir setze W 1 = 10 4, W 2 = 01000, W 3 = 00100. 56
Mit diesem Code wird die Folge codiert durch 00000000011001000100 000100001110010011. I diesem Fall ist p w = 243 512. Dieses ist größer als 1 b c = 1 3. Wir erhalte also eie Kompressio vo Date. Das obe beschriebee Verfahre beutze eie bekate Wahrscheilichkeitsverteilug ud ei statisches Wörterbuch. Das Wörterbuch wird eimal agelegt ud bleibt da uverädert. Bei der LZ-Codierug. die wir als ächste kee lere werde, wird icht vorausgesetzt, dass eie Wahrscheilichkeitsverteilug bekat ist. Deshalb wird auch kei statisches Wörterbuch beutzt, soder das Wörterbuch wird bei der Codierug der Date dyamisch agelegt. Die Huffma-Codierug ud die Shao-Fao-Elias-Codierug arbeite ur bei fester Eigabeverteilug. Etspricht die bei der Codierug ageommee Verteilug icht der Wahrscheilichkeitsverteilug auf de Quellsymbole, so erreiche die Codierug keie optimale Kompressio der Quelle. Vo der LZ-Codierug werde wir zeige, dass bei Quellalphabet {0, 1} ud eier beliebige ud ubekate Verteilug p = (p(0), p(1)) auf {0, 1} die LZ-Codierug asymptotisch optimal ist. 3.2 Die Lempel-Ziv-Codierug LZ78 Es gibt viele verschiede Variate der LZ-Codierug. Alle gehe auf zwei Arbeite vo Lempel ud Ziv aus de Jahre 1977 bzw. 1978 zurück. Ma teilt die verschiedee Variate vo LZ-Codierug deshalb i zwei Familie auf, geat LZ77 ud LZ78. Wir werde zuächst eie Form der LZ78 Variate kee lere. Vo dieser werde wir zeige, dass sie bei beliebiger Verteilug asymptotisch optimal ist. Später werde wir da auch die praktisch bessere LZ77-Variate kee lere. Die LZ-Codierug wird i der Regel zur Textkompressio eigesetzt. D.h., als Quellalphabet köe wir etwa {0, 1} ehme, aber die LZ-Codierug beötigt keie feste Blockläge. Deshalb werde wir häufig vo der Codierug eier Folge i {0, 1} rede. Um die Lempel-Ziv-Codierug eier Folge x {0, 1} zu defiiere, beötige wir zuächst de Begriff eies Parsig. Defiitio 3.2.1 Ei Parsig eier Folge x {0, 1} ist eie Aufteilug vo x i (zusammehägede)teilfolge y 1,..., y c. Ei Parsig y 1,..., y c heisst disjuktes Parsig, we die Folge y i paarweise verschiede sid. 57
Das Lempel-Ziv-Parsig eier Folge x = x 1 x ist u ei spezielles disjuktes Parsig eier Folge, das folgedermasse defiiert ist. y 1 = x 1 Sid y 1,..., y l bereits defiiert ud gilt y 1 y l = x 1 x k, so ist y l+1 die kürzeste Teilfolge vo x, die mit x k+1 begit ud vo alle y i, i = 1,..., l, verschiede ist. Um uiteressate techische Details zu vermeide, gehe wir immer davo aus, dass es am Ede vo x keie Probleme gibt, die letzte Teilfolge y c zu kostruiere. Betrachte wir als Beispiel die Folge x = 1011010100010. Das Lempel-Ziv- Parsig dieser Folge ist 1, 0, 11, 01, 010, 00, 10. Die folgede Eigeschafte des Lempel-Ziv-Parsigs folge umittelbar aus seier Defiitio. Lemma 3.2.2 Sei y 1,..., y c das Lempel-Ziv-Parsig eier Folge x. Weiter setze y 0 = ɛ. Es gilt 1. y 1,..., y c ist ei disjuktes Parsig der Folge x. 2. Zu jeder Folge y i, 1 i c, gibt es ei Bit b ud eie eideutige Idex 0 j i 1, so dass y i = y j b. Die Ziv-Lempel-Codierug eier Folge x = x 1 x wird u durch de folgede Algorithmus berechet. LZ-Codierug 1. Bereche das Lempel-Ziv-Parsig y 1,, y c vo x. Setze y 0 = ɛ. 2. Codiere jede Teilfolge y i durch das Paar (j, b), wobei 1 j i 1, b {0, 1}, ud y i = y j b. Hierbei werde der Idex j durch log(c) Bits codiert. 3. Gebe die Folge der Codieruge der y i aus. 58
Die Lempel-Ziv-Codieruge beutzt ebe Bits auch Klammer ud Kommata. Dieses ka vermiede werde, idem zuächst c selber geeiget codiert wird, etwa durch 0 c 1, ud da jedes y i durch de Idex seier Präfixfolge ud sei letztes Bit codiert wird, ohe dass Klammer oder Kommata beutzt werde. Um die Teilfolge y i ud ihre Codieruge zu bereche, werde wir die Folge x = x 1 x bitweise abarbeite. Wir halte dabei als Datestruktur eie sukzessive wachsede biäre Baum mit Wurzel aufrecht. Zu jedem Zeitpukt sid die Kate dieses Baums mit 0, 1 gelabelt. Die Kote des Baums erhalte Labels aus {0,..., c 1}. Zu Begi besteht der Baum ur aus der Wurzel, die mit 0 gelabelt ist. Außerdem verwalte wir eie Zeiger. Dieser zeigt zu Begi auf die Wurzel. Schließlich habe wir och eie Zähler z, der das jeweils größte bereits vergebee Kotelabel speichert. Iitialisiert ist der Zähler mit 0. Lese wir u das ächste Bit x i vo x, so werde folgede Schritte ausgeführt. Führt aus dem Kote, auf de der Zeiger gerade zeigt, eie Kate gelabelt mit x i, so setze de Zeiger auf de Kote, zu dem diese Kate führt. Existiert aus dem Kote, auf de der Zeiger gerade zeigt, keie Kate mit Label x i, füge i dem Baum eie eue Kote ei. Dieser erhält das Label z + 1. Der eue Kote wird u mit dem Kote, auf de der Zeiger gerade zeigt, durch eie Kate gelabelt mit x i verbude. Ist j der Idex des Kotes, auf dem der Zeiger aktuell zeigt, so wird die Codierug um das Paar (j, x i ) erweitert. Da wird der Zeiger auf die Wurzel gesetzt ud der Zähler wird um 1 erhöht. Für user eiführedes Beispiel ist i Abbildug 3.1 der Baum dargestellt, der etstade ist, achdem die gesamte Folge x = 1011010100010 eigelese wurde. Da wir de Baum i liearer Zeit aufbaue köe ud daher auch die relevate Iformatioe für die LZ-Codierug i liearer aus dem Baum auslese köe, erhalte wir Lemma 3.2.3 Für eie Folge x {0, 1} ka die LZ-Codierug i Zeit O() berechet werde. Jetzt wolle wir us überlege, dass wir auch aus der Codierug C(x) eies Wortes x, das Wort x i liearer Zeit bereche köe. Liear bedeutet hierbei sowohl liear i der Läge vo C(x) als auch liear i der Läge vo x (warum?) Hier zuächst eie Beschreibug des Algorithmus. Eigabe des 59
Abbildug 3.1: Ei LZ-Baum Algorithmus ist eie Folge vo c Paare (i 1, b 1 ),..., (i c, b c ), wobei 0 i j c 1, b i {0, 1}. Schritt 1: Setze m := ɛ. LZ-Decodierug Schritt 2: Für z = 1,..., c wiederhole folgede Schritte. Schritt 3: Setze a := ɛ, l := z. Schritt 4: Solage l 0 wiederhole folgede Schritt. Schritt 5: Setze a := ab l, l := i l. Schritt 6: Setze m := ma. Schritt 7: Ausgabe m. Ma überlegt sich leicht, dass der Algorithmus korrekt ist. Wird ählich wie bei der Codierug ei LZ-Baum beutzt, ka auch gezeigt werde, dass der Algorithmus lieare Laufzeit hat. Lemma 3.2.4 Für eie Folge x {0, 1} ka x aus der LZ-Codierug vo x i Zeit O() berechet werde. 60
3.2.1 LZ-Codierug ist asymptotisch optimal Wir wolle u zeige, dass die LZ-Codierug bei beliebiger Wahrscheilichkeitsverteilug auf {0, 1} asymptotisch optimal ist. Sei x {0, 1}. Ist da c(x) die Azahl der Teilfolge y i im LZ-Parsig vo x, so wird x durch ei Wort f(x) mit Läge f(x) c(x)(log c(x) + e), (3.1) codiert. Hierbei ist e eie feste Kostate uabhägig vo ud x. Als erstes leite wir eie obere Schrake für c(x) her. Lemma 3.2.5 Sei x {0, 1}, 2, ud c(x) die Azahl der Teilfolge i eiem beliebige disjukte Parsig vo x. Da gibt es eie Kostate b, so dass c(x) b log log log(). (3.2) Beweis: Für k 1, sei k die Summe der Läge aller Folge über {0, 1} der Läge höchstes k. Es gilt k = k j2 j = (k 1)2 k+1 + 2. (3.3) j=1 Sei u zuächst = k. Eie Folge x {0, 1} mit möglichst grossem c(x) besteht da aus alle Folge der Läge höchstes k. Es gilt also c(x) k j=1 2 j = 2 k+1 2 < 2 k+1 < k k 1. (3.4) Ist u k < k+1, so schreibe wir = k +, wobei 0 < k+1 k = (k + 1)2 k+1. Eie Folge x der Läge mit möglichst großem c(x) besteht u aus alle Folge der Läge höchstes k ud /(k + 1) Folge der Läge k + 1 (wir ehme a k + 1 teilt ). Da gilt c(x) k k 1 + k + 1 k + k 1 = k 1. (3.5) Für k < k+1 wolle wir u k i Abhägigkeit vo abschätze. Aus k = (k 1)2 k+1 + 2 2 k folger wir k log. (3.6) 61
Hieraus ud mit < k+1 = k2 k+2 + 2 folger wir 2 < (log()2 k+2. Dieses liefert k + 2 log ( 2). (3.7) log Damit gilt k b (log log log(), für eie Kostate b 0. Da wir bereits wisse, dass c(x) (siehe 3.5), folgt das Lemma. k 1 gilt Sei u y 1,..., y c(x) ei disjuktes Parsig der Folge x {0, 1}. Mit, 1 l bezeiche wir u die Azahl der Teilfolge y i mit y i {0, 1} l. Da gilt = c(x) ud l =. (3.8) Wir erhalte da das so geate Lemma vo Ziv. Lemma 3.2.6 (Lemma vo Ziv) Für jede Wahrscheilichkeitsverteilug p = (p 0, p 1 ) ud für jedes disjukte Parsig y 1,... y c(x) eier Folge x gilt log p(x) log. (3.9) j=1 Beweis: Da p(x) = c(x) i=1 p(y i) gilt log p(x) = = = c(x) log p(y i ) i=1 y i {0,1} l log p(y i ) 1 log p(y i). y i {0,1} l 62
Da 1 y i {0,1} l = 1 ud der Logarithmus eie kovexe Fuktio ist, gilt log p(x) = 1 log p(y i) y i {0,1} l log p(y i) wobei wir 1 log = y i {0,1} l 1 log, y i {0,1} l p(y i ) 1 beutzt habe. Aus diesem Lemma erhalte wir Lemma 3.2.7 Es sei für jede Folge x {0, 1} die Läge eies beliebige disjukte Parsigs vo x mit c(x) bezeichet. Für jede Wahrscheilichkeitsverteilug p = (p 0, p 1 ) gilt 1 E(c(x) log c(x)) H(p) + γ, (3.10) wobei γ 0 für. Beweis: Mit dem Lemma vo Ziv gilt für alle x {0, 1} Die Summe log p(x) = log log c(x)c l(x) c(x) = c(x) log c(x) c(x) c(x) log c l(x) c(x) ka als die Etropie der Wahrscheilichkeitsverteilug q(x) = c l(x) c(x) c(x) log c l(x) c(x). aufgefasst werde. Vo dieser ka mit de Glei- 63
chuge i (3.8) ud eiigem Aufwad gezeigt werde, dass sie lagsamer wächst als /c(x). Mit adere Worte Damit erhalte wir log p(x) H(q)c(x) 0 für. c(x) log c(x) c(x) c(x) log c l(x) c(x) = c(x) log c(x) wobei γ 0 für. Also gilt c(x) log c(x) + γ, log p(x) Woraus folgt 1 E(c(x) log c(x)) ( p(x) x {0,1} + γ. log p(x) + γ ) = 1 p(x) log p(x) + γ x {0,1} = H(p) + γ. Nu köe wir beweise, dass die Lempel-Ziv-Codierug asymptotisch optimal ist. Satz 3.2.8 Bei beliebiger Wahrscheilichkeitsverteilug p kovergiert die erwartete Codewortläge pro Quellsymbol der Lempel-Ziv-Codierug gege die Etropie H(p). Beweis: Nach (3.1) ist die erwartete Codewortläge pro Quellsymbol der Lempel-Ziv-Codierug gegebe durch 1 p(x)c(x)(log c(x) + e) = 1 E(c(x) log c(x)) + x {0,1} p(x) ec(x) x {0,1} = H(p) + γ + p(x) ec(x). x {0,1} 64
Nach Lemma 3.2.5 gilt u aber ec(x) = eb (log log log(), für eie Kostate b. Da auch e eie Kostate ist, kovergiert dieser Ausdruck für gege 0. Damit kovergiert die erwartet Codewortläge pro Quellsymbol der Lempel-Ziv-Codierug gege die Etropie. 65