1 Effiziente Algorithmen und Komplexitätstheorie Vorlesung Thomas Jansen 22.06.2006
2 Ein anderer Ansatz Beobachtung in Dokumenten eines Typs wiederkehrende Muster Idee Muster in Wörterbuch speichern, codieren durch Index Beispiel Σ = 2 l Wörterbuch D für 2 w häufigste Wörter aus Σ k codiere x D mit w + 1 Bits codiere x / D mit l + k + 1 Bits Hilft das? krude Abschätzung W keit p für x D ohne Wörterbuch für n Wörter n (l + k) Bits mit Wörterbuch für n Wörter erwartet n p (w + 1) + n (1 p) (l + k + 1) Bits klar Wörterbuch besser, wenn p > 1 (l+k) w (viel größer als bei Gleichverteilung)
3 Statische Wörterbücher Wann kann man sinnvolle statische Wörterbücher finden? nur hochspezialisierte Anwendungen etwas weniger spezialisiert Buchstabenpaar-Codierung Wörterbuch der Größe 2 w mit 2 w > Σ mit Σ Einträgen s 1,..., s n Σ und mit 2 w Σ Einträgen für die häufigsten Buchstabenpaare Anmerkung für homogene Daten (z. B. Java-Sourcecode) sinnvoll Anmerkung man muss nicht Codierung fester Länge verwenden...
4 Adaptive Wörterbücher zwei zentrale Paper Ziv, Lempel (1977): A universal algorithm for sequential data compression. LZ77 Ziv, Lempel (1978): Compression of individual sequences via variable-rate coding. LZ78 LZ77 Lasse Fenster der Größe w über Text laufen. Wörterbuch (search buffer) der Größe s ist linker Teil im Rest (look-ahead buffer) der Größe w s zu codierender Text übermittle Tripel o, l, c aus Offset o, Länge der Übereinstimmung l und nächstes Zeichen c
5 Beispiele LZ77 E M U H E N E M E N E T U search buffer look-ahead buffer 0,0,c(M) 4,3,c(T) S C H A L A L A L A!!! search bufferlook-ahead buffer 2,4,c(!) S O R G E N S O R G E N S O R G search buffer look-ahead buffer 0,0,c(S) 0,0,c(O) klar Decodierung immer einfach Größe eines Tripels log S + log W + log Σ
Über LZ77 Vorteile einfach, leicht zu implementieren effizient keine Kenntnis über Quelle erforderlich Nachteile Annahme der Lokalität von Musterwiederholungen im Worst Case extrem aufblähend Codierung einzelner Zeichen mit Tripeln unbefriedigend Modifikationen Codierung der Tripel mit variabler Länge Größe des Fensters Flag-Bit für Paar/Einzelzeichen (Paare statt Tripel, effiziente Einzelzeichencodierung) LZSS (Lempel, Ziv, Storer, Syzmanski) Anmerkung Varianten verwendet in zip, pkzip, lharc, arj 6
7 LZ78 Verwende ein externes Wörterbuch. Codiere durch Paare i, c(s) (i N 0 Index im Wörterbuch, s Σ erster nicht passender Buchstabe) i, c(s) wird neuer Eintrag wichtig Wörterbuchkonstruktion für Codierung und Decodierung identisch machen! Beispiel S C H A L A L A L A L A! Wörterbuch 1: S 2: C 0,c(S) 0,c(C) 0,c(H) 0,c(A) 0,c(L) 3: H 4,c(L) 6,c(A) 5,c(A) 0,c(!) 4: A 5: L Problem Wörterbuch wächst unbeschränkt 6: AL 7: ALA 8: LA 9:!
8 LZW Welch (1984): A technique for high-performance data compression. Ziel modifiziere LZ78 so, dass Übertragung des Index im Wörterbuch ausreicht Algorithmus LZW Starte mit Wörterbuch mit Einträgen für alle s Σ. Übertrage Index des Eintrags mit maximaler Länge. Verlängere dieses Muster um nächsten Buchstaben und füge ein. Übertrage nächstes Muster mit diesem Anfangsbuchstaben.
9 Beispiel LZW-Codierung 7 S C H A L A L A L A L A! 4 5 2 6 11 13 12 1 Wörterbuch 1:! 2: A 3: B 4: C 5: H 6: L 7: S 8: SC 9: CH 10: HA 11: AL 12: LA 13: ALA 14: ALAL 15: LA!
10 Beispiel LZW-Decodierung 7 4 5 2 6 11 13 12 1 Wörterbuch 1:! 2: A S C H A L A L A L A L A! 3: B 4: C 5: H 6: L Beobachtung korrekt mit Sonderfall 7: S 8: SC 9: CH 10: HA 11: AL 12: LA 13: ALA 14: ALAL 15: LA!
11 Beispiel für LZW: compress compress anfangs Wörterbuchgröße 512 Index = 9 wenn Wörterbuch voll Wörterbuchgröße verdoppeln also Wörterbuchgröße 1024 Index = 10 bei vollem Wörterbuch so fortsetzen, bis Index = 16 (Wörterbuchgröße 2 16 = 65 536) ab Wörterbuchgröße 65 536 statisches Wörterbuch dabei Kompressionsfaktor beobachten, wenn zu schlecht, mit leerem Wörterbuch Wörterbuchaufbau neu starten Beobachtung Kompromiss zwischen Wörterbuchflexibilität und -größe bei Erhaltung der Lokalität des Wörterbuchs
12 Weitere Beispiele für LZW Graphics Interchange Format (GIF) sehr ähnlich wie compress Wörterbuchgröße von Farbtiefe abhängig Anmerkung gut geeignet für regelmäßige Bilder weniger gut für Fotos V.42 bis (Datenkompression bei Übertragung über Modems) zwei Modi transparent und compressed minimale Wörterbuchgröße 512 Verhandlung der Wörterbuchgröße Teil des Protokolls reservierte Codewörter für Moduswechsel und Wörterbuchvergrößerung Verwendung des letzten Wörterbucheintrags verboten ( keine Sonderfälle)
Noch ein anderer Ansatz ein kleiner Umweg... List Update Liste mit n festen Elementen, ungeordnet Zugriff durch lineares Durchsuchen von vorne nach hinten Problem organisiere die Liste dabei so um, dass Zugriffszeiten klein werden selbstorganisierende Datenstruktur lange bekannter Algorithmus Move-To-Front Move-To-Front Verschiebe zugegriffenes Element an Listenanfang Ist das ein guter Algorithmus? im Worst Case sicher nicht: immer hinterstes Element anfragen Beobachtung Gilt für jeden Algorithmus Wie kann man Performanz vernünftig messen? 13
14 Das List-Update-Problem Spielregeln Zugriff auf Element auf Position i verursacht Kosten i nach Zugriff darf Element beliebig nach vorne bewegt werden, dafür keine Kosten bei Problemen üblich Eingabe zu Beginn vollständig bekannt hier Anfragesequenz wird erst nach und nach bekannt Online-Problem Eingabe wird stückweise bekannt Offline-Problem Eingabe sofort ganz bekannt dazu korrespondierend Online-Algorithmus und Offline-Algorithmus Definition 210 A Online-Algorithmus, Kosten A(σ) auf Eingabefolge σ, OPT(σ) Kosten eines optimalen Offline-Algorithmus auf σ. A heißt c-kompetitiv, wenn b : σ : A(σ) c OPT(σ) + b.
Kompetitivität von Move-To-Front Theorem 211 Move-To-Front ist ( 2 n) 1 -kompetitiv auf Listen mit n Elementen. Beweis. Sei A optimaler Offline-Algorithmus. Sei L A i Sei L MTF i Liste von A nach i-ten Zugriff. Liste von Move-To-Front nach i-tem Zugriff. initial L A 0 = LMTF 0 amortisierte Analyse mit Potenzialfunktion Φ definiere Φ i := #Inversionen zwischen L A i und L MTF i Betrachte i-ten Zugriff: LookUp(x) Situation vorher L MTF i 1 S U x T L A i 1 T S x U S vor x in beiden Listen T vor x in L A i, hinter x in L MTF i U vor x in L MTF i, hinter x in L A i 15
16 Beweis von Theorem 211 L Situation vorher MTF i S U x T L A i T S x U S vor x in beiden Listen T vor x in L A i, hinter x in L MTF i U vor x in L MTF i, hinter x in L A i also darum ti MTF = S + U + 1 ti A = S + T + 1 Φ i Φ i 1 S U amortisierte Rechenzeit a i = t i +Φ i Φ i 1 S + U +1+ S U ( = 2 S + 1 2ti A 1 2 1 ) ti A n
Move-To-Front-Codierung Was hat das mit Kompression zu tun? Move-To-Front als Vorbereitung zur Kompression 1. für Σ = {s 1, s 2,..., s n } erzeuge Liste s 1, s 2,..., s n 2. für jeden zu codierenden Buchstaben wähle Position 1 als Codierung und benutze Move-To-Front 3. Codiere Zahlenfolge mit Kompressionsverfahren (z. B. Huffman-Codierung) Funktioniert das? Eindeutig decodierbar? anfangs Liste bekannt darum aus erster Zahl und Liste codierter Buchstabe ablesbar außerdem neue Liste durch Move-To-Front herstellbar also nachher Liste bekannt wie vorher Was nützt das? klar Buchstabenfolge a i j0 i 1 Hoffnung 0 noch viel häufiger als häufigster Buchstabe Wunsch lange Buchstabenfolgen a i 17
18 Beispiel Move-To-Front S C H A L A L A L A L A! Liste 0 1 2 3 4 5 6! A L H C S B 6 4 5 4 6 1 1 1 1 1 1 1 5 relative Häufigkeiten 5 4 1 1 1 1 Original A: 13 L: 13 C: 13 H: 13 S: 13!: 13 B: 0 7 2 2 2 Move-To-Front 1: 13 4: 13 5: 13 6: 13 0: 0 2: 0 3: 0 klar günstig für anschließende Huffman-Codierung
19 Noch eine Transformation Burrows, Wheeler (1995): A block-sorting losless data compression algorithm. Idee Ordne Eingabe so um, dass sie Move-To-Front-freundlicher wird. Beobachtung umordnen Permuation (also bijektiv ) ideal wäre sortiere buchstabenweise SCHALALALALA!!AAAAACHLLLLS Invertierbar? grundsätzlich jede Permutation invertierbar Problem benötigte Zusatzinformationen
20 Die Burrows-Wheeler-Transformation Eingabe Text X = x 1 x 2 x l 1 x l 1. Betrachte X 1 := x 1 x 2 x l 1 x l X 2 := x l x 1 x l 2 x l 1 X 3 := x l 1 x l x l 3 x l 2. X l := x 2 x 3 x l x 1 2. Sortiere X 1, X 2,..., X l lexikographisch aufsteigend. 3. Gib Folge der letzten Zeichen und Index der Originalzeile als Ausgabe aus. Beispiel SCHALALALALA! Ausgabe ALLLLHSCAAAA!, 12
21 Beispiel Burrows-Wheeler-Transformation Beispiel SCHALALALALA! 0 S C H A L A L A L A L A! 1! S C H A L A L A L A L A 2 A! S C H A L A L A L A L 3 L A! S C H A L A L A L A 4 A L A! S C H A L A L A L 5 L A L A! S C H A L A L A 6 A L A L A! S C H A L A L 7 L A L A L A! S C H A L A 8 A L A L A L A! S C H A L 9 L A L A L A L A! S C H A 10 A L A L A L A L A! S C H 11 H A L A L A L A L A! S C 12 C H A L A L A L A L A! S
22 Beispiel Burrows-Wheeler-Transformation (Fortsetzung) Beispiel SCHALALALALA! Sortiert 0! S C H A L A L A L A L A 1 A! S C H A L A L A L A L 2 A L A! S C H A L A L A L 3 A L A L A! S C H A L A L 4 A L A L A L A! S C H A L 5 A L A L A L A L A! S C H 6 C H A L A L A L A L A! S 7 H A L A L A L A L A! S C 8 L A! S C H A L A L A L A 9 L A L A! S C H A L A L A 10 L A L A L A! S C H A L A 11 L A L A L A L A! S C H A 12 S C H A L A L A L A L A! Ausgabe ALLLLHSCAAAA!, 12
23 Rücktransformation Und das ist invertierbar? Wie ALLLLHSCAAAA!, 12 SCHALALALALA!? Beobachtung jede Zeile und jede Spalte ist Permutation des Originals Beobachtung letzte Spalte sortieren erste Spalte Beobachtung Index identifiziert Anfangsbuchstaben Beobachtung Zeile, die mit diesem Buchstaben endet, beginnt mit zweitem Buchstaben also Original wieder rekonstruierbar
Beispiel Rücktransformation ALLLLHSCAAAA!, 12 SCHALALALALA! Index erste Spalte letzte Spalte 0! A 1 A L 2 A L 3 A L 4 A L 5 A H 6 C S 7 H C 8 L A 9 L A 10 L A 11 L A 12 S! 24
25 Zur Burrows-Wheeler-Transformation gesehen effizient berechenbar reversibel Warum ist das sinnvoll? klar erste Spalte komplett sortiert ( ideal ) Beobachtung letzte Spalte direkter Nachbar der ersten Spalte Hoffnung benachbarte Spalte mit starken Korrelationen dann letzte Spalte auch ziemlich sortiert Anwendung zur Kompression Burrows-Wheeler-Transformation Move-To-Front-Codierung klassische Kompression (arithmetische Codes oder Huffman)
26 Burrows-Wheeler-Transformation und Move-To-Front am Beispiel SCHALALALALA! SCHALALALALA! BWT ALLLLHSCAAAA!, 12 MTF 1, 5, 0, 0, 0, 5, 6, 6, 4, 0, 0, 0, 5, 7, 8, 9 Anmerkungen nach MTF noch besser als nach BWT hier wegen neuer Buchstaben (,, 1, 2 ) nicht so gut in der Praxis mit sehr langen Blocklängen benutzt implementiert z. B. in bzip2 problematisch Speicherplatz
27 Burrows-Wheeler-Kompression: Verbesserungen dreischrittiges Kompressionsverfahren Burrows- Wheeler- Transformation Globale Struktur- Transformation Entropie- Kodierung Burrows-Wheeler-Transformation Globale Strukturtransformation Move-To-Front Entropie-Kodierung Huffmann oder arithmetische Codes zur Entropie-Kodierung Huffman-Codierung deutlich schneller arithmetische Codes deutlich bessere Kompression