Agorithmen und Datenstrukturen 2 Sommersemester 2006 7. Voresung Peter F. Stader Universität Leipzig Institut für Informatik studa@bioinf.uni-eipzig.de
Lempe-Ziv Agorithmen LZ77 (Siding Window) Varianten: LZSS (Lempe-Ziv-Storer-Szymanski) Appications: gzip, Squeeze, LHA, PKZIP, ZOO LZ78 (Dictionary Based) Variants: LZW (Lempe-Ziv-Wech), LZC (Lempe-Ziv-Compress) Appications: compress, GIF, CCITT (modems), ARC, PAK Normaerweise wurde LZ77 as besser und angsamer as LZ78 betrachtet, aber auf eistungsfähigeren Rechnern ist LZ77 auch schne. P. Stader Agorithmen und Datenstrukturen 2 2
LZ77: Siding Window Lempe-Ziv Cursor a a c a a c a b c a b a b a c Dictionary (previousy coded) Lookahead Buffer Dictionary- und Buffer-Windows haben feste Länge und verschieben sich zusammen mit dem Cursor. An jeder Cursor-Position passiert fogendes: Ausgabe des Tripes (p,,c) p = reative Position des ongest match im Dictionary = Länge des ongest match c = nächstes Zeichen rechts vom ongest match Verschiebe das Window um + 1 P. Stader Agorithmen und Datenstrukturen 2 3
LZ77: Exampe a a c a a c a b c a b a a a c a a c a a c a b c a b a a a c a a c a a c a b c a b a a a c a a c a a c a b c a b a a a c a a c a a c a b c a b a a a c (0,0,a) (1,1,c) (3,4,b) (3,3,a) (1,2,c) Dictionary (size = 6) Longest match Next character P. Stader Agorithmen und Datenstrukturen 2 4
LZ77 Decoding Der Decodierer arbeitet mit dem seben Dictionary-Window wie der Codierer Im Fae des Tripes (p,,c) geht er p Schritte zurück, iest die nächsten Zeichen und kopiert diese nach hinten. Dann wird noch c angefügt. Was ist im Fae > p? (d.h. nur ein Tei der zu copierenden Nachricht ist im Dictionary) Beispiedict= abcd, codeword = (2,9,e) Lösung: Kopiere einfach zeichenweise: for (i = 0; i < ength; i++) out[cursor+i] = out[cursor-offset+i] Out = abcdcdcdcdcdce P. Stader Agorithmen und Datenstrukturen 2 5
LZ77 Optimierungen bei gzip I LZSS: Der Output hat eins der zwei Formate (0, position, ength) oder (1,char) Benutze das zweite Format, fas ength < 3. a a c a a c a b c a b a a a c a a c a a c a b c a b a a a c a a c a a c a b c a b a a a c (1,a) (1,a) (1,c) a a c a a c a b c a b a a a c (0,3,4) P. Stader Agorithmen und Datenstrukturen 2 6
Optimierungen bei gzip II Nachträgiche Huffman-Codierung der Ausgabe Cevere Strategie bei der Codierung: Mögicherweise eraubt ein kürzerer Match in diesem Schritt einen vie ängeren Match im nächsten Schritt Benutze eine Hash-Tabee für das Wörterbuch. Hash-Funktion für Strings der Länge drei. Suche für ängere Strings im entsprechenden Überaufbereich die ängste Übereinstimmung. P. Stader Agorithmen und Datenstrukturen 2 7
Theorie zu LZ77 LZ77 ist asymptotisch optima [Wyner-Ziv,94] LZ77 komprimiert hinreichend ange Strings entsprechend seiner Entropie, fas die Fenstergröße gegen unendich geht. 1 H n = p( X )og n p( X ) X A H = im H n n Achtung, hier ist wirkich eine sehr große Fenstergröße nötig. In der Praxis wird meist ein Puffer von 2 16 Zeichen verwendet. P. Stader Agorithmen und Datenstrukturen 2 8
Die Burrows-Wheeer-Transformation Michae Burrows und David Wheeer, Mai 1994 Verwendet in bzip Die Kompression ist sehr gut geeignet für Text, da Kontext berücksichtigt wird. Die eigentiche Burrows-Wheeer-Transformation ist eine vorgeagerte Umordnung von Textböcken, die eine spätere Kompression mit einem Move-to-Front-Kodierer und einer weiteren Huffman-Codierung vorbereitet. P. Stader Agorithmen und Datenstrukturen 2 9
BWT: Erster Schritt Ein Eingabebock der Länge N wird as quadratische Matrix dargestet, die ae Rotationen des Eingabebocks enthät. Die Zeien der Matrix werden aphabetisch sortiert. Die etzte Spate und die Zeiennummer des Originabocks werden ausgegeben. In dieser Ausgabe sorgt ein ähnicher Kontext von Buchstaben inks davor zu angen Runs geicher Buchstaben. Daraus ässt sich der Originabock wieder rekonstruieren (wird hier nicht bewiesen, sondern nur am Beispie gezeigt). P. Stader Agorithmen und Datenstrukturen 2 10
Die Burrows-Wheeer-Transformation Vorwärtstransformation von HeoCeo 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 H e o C e o 0 C e o H e o 1 e o C e o H 1 H e o C e o I 2 o C e o H e 2 e o C e o H 3 o C e o H e 3 e o H e o C 4 o C e o H e 4 o C e o H e 5 C e o H e o 5 o H e o C e 6 e o H e o C 6 o C e o H e 7 o H e o C e 7 o H e o C e 8 o H e o C e 8 o C e o H e 9 o H e o C e 9 o H e o C e HeoCeo oohcee L P. Stader Agorithmen und Datenstrukturen 2 11
Die Burrows-Wheeer-Transformation Rücktransformation 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 C o 0 C o N 5 1 H o I 1 H o I 2 e H N 1 2 e H N 1 3 e C 3 e C N 6 4 e N 2? 4 e N 2 5 e N 2? 5 e N 7 6 6 N 3 7 7 N 8 8 o 8 o N 4 9 o 9 o N 9 F L F L P. Stader Agorithmen und Datenstrukturen 2 12
MTF: Move-To-Front-Coding 0 0 0 A 0 A 0 B 1 1 1 0 1 0 1 A............ 65 A 65 @ 65 @ 65? AAB 66 B 66 B 66 B 66 @ 65, 0, 66 67 C 67 C 67 C 67 C............ 255 255 255 255 255 255 255 255 Eingabe: A A B B C C C A A B C C C Ausgabe: 65 0 66 0 67 0 0 2 0 2 2 0 0 P. Stader Agorithmen und Datenstrukturen 2 13
Effektive Datenstrukturen für Lexika Viee Anwendungen besitzen Wörterbücher, in denen häufig und schne nachgeschagen werden muß: Textverarbeitung: Rechtschreibkontroe Maschinee Übersetzung Voice recognition Die nötigen Wörterbücher sind meist sehr groß. Deshab: Hohe Kompressionsrate ist erwünscht, damit die Wörterbücher im Hauptspeicher gehaten werden können. P. Stader Agorithmen und Datenstrukturen 2 14
Beobachtungen zu Wörterbüchern Wörterbücher enthaten fast nur Listen von Wörtern oder Wortgruppen: Reine Wortisten für Rechtschreibkontroe Wort-Bigramme oder Trigramme (evt. mit Gewichtung) bei Voice recognition Wörter und Angabe dazu (z.b. Grammatikangabe) Beobachtungen Wir können die Liste z.b. aphabetisch sortieren, dann gibt es vorn große Wiederhoungen, die wir nutzen können. Es gibt auch hinten große Regemäßigkeiten. Nutzung ist zunächst unkar. Je größer eine Wortiste ist, desto ausgeprägter ist die Regemäßigkeit. Mögicherweise assen sich aso größere Listen noch besser komprimieren. Häufig müssen Wörterbücher nur einma erstet und nicht mehr verändert werden. Die Datenstruktur muß aso kein Einfügen unterstützen. Fas nötig, kann ein traditionees, keines Nutzerwörterbuch angeegt werden. P. Stader Agorithmen und Datenstrukturen 2 15
Die Idee: Trie und DAWG Lexikon mit den Wörtern dance, darts, start und smart P. Stader Agorithmen und Datenstrukturen 2 16
DAWG: Directed Acycic Word Graph Ein DAWG eraubt extrem schnee Suche nach Wörtern. Die Suche erfogt anaog zum Trie: Die aufzusuchende Buchstabenfoge entspricht der Knotenfoge im Baum. In den fogenden Darsteungen gibt es von jedem Knoten ausgehend Kindknoten (Chid) und Nextknoten. Letztere zeigen auf den nächsten Knoten, der sich in der geichen Hierarchieebene wie der gegenwärtige Knoten befindet. Zusätzich gibt es Wortende-Markierungen (EOW) Beispie: DAWG mit den Wörtern CAT, CAN, DO und DOG: C --Chid--> A --Chid--> N (EOW) Next Next v T (EOW) v D--Chid--> O (EOW) --Chid --> G (EOW) P. Stader Agorithmen und Datenstrukturen 2 17
Suchen von CAT im DAWG C --Chid--> A --Chid--> N (EOW) Next Next v T (EOW) v D--Chid--> O (EOW) --Chid --> G (EOW) Starten beim Startknoten C. Dieser ist korrekt, aso weiter zu Kind-Knoten. Wir finden A. A ist korrekt, aso weiter zu Kind-Knoten. Wir finden N. Das ist fach, aso weiter zu Next-Knoten. Wir finden T. T ist korrekt, wir befinden uns an einem EOW-Knoten, aso haben wir das gesuchte Wort gefunden. P. Stader Agorithmen und Datenstrukturen 2 18
Kompression an Wortenden Zur Kompression an Wortenden werden Knoten weiter unten im Graphen zusammengehängt. Das Beispie enthät DOG und LOG, aber nicht DO. D --Chid--> O --Chid--> G(EOW) ^ Next v L --Chid---- P. Stader Agorithmen und Datenstrukturen 2 19
Aufbau eines DAWG Der Aufbau erfogt in zwei Schritten: Schritt 1: Aufbau eines Tries in beiebiger Reihenfoge wie übich. Einfügen ist an jeder Stee mögich. Schritt 2: Zusammenfassen geicher Wortenden. Dazu dient der fogende Agorithmus, erkärt am Beispie. Beispie: Wörterbuch mit CITIES, CITY, PITIES und PITY, zunächst as Trie. C --Chid--> I --Chid--> T --Chid--> I --Chid--> E --Chid-> S (EOW) Next Next v Y (EOW) P --Chid--> I --Chid--> T --Chid--> I --Chid--> E --Chid-> S (EOW) Next v Y (EOW) P. Stader Agorithmen und Datenstrukturen 2 20
Verschmezen von Wortenden Zu verschmezende Wortenden müssen vöig übereinstimmen. Von den Bättern ausgehend wird eine inverse Höhe eingeführt: Bätter haben inverse Höhe 0. Die Inverse Höhe eines Knotens ist 1 + Maximum der inversen Höhen seiner Kinder. Für ae Paare von Chid-Knoten geicher inverser Höhe wird von 0 beginnend der fogende Verschmezungsschritt ausgeführt: Zwei Knoten werden verschmozen, fas sie vokommen identisch sind, d.h. Sie tragen den geichen Buchstaben as Bezeichner. Sie tragen beide ein oder beide kein EOW-Fag. Fas sie Next-Knoten besitzen, müssen auch diese vokommen identisch sein. P. Stader Agorithmen und Datenstrukturen 2 21
Erster Verschmezungsschritt S und Y haben inverse Hohe 0. Verschmezung der S-Bätter. Achtung: Die Y-Knoten werden nicht verschmozen, wei sie keine Chid-Knoten sind. C --Chid--> I --Chid--> T --Chid--> I --Chid--> E --Chid--> S(EOW) ^ Next Next v Y (EOW) P --Chid--> I --Chid--> T --Chid--> I --Chid--> E --Chid-- Next v Y (EOW) P. Stader Agorithmen und Datenstrukturen 2 22
Zweiter Verschmezungsschritt Nur E hat inverse Höhe 2. Die E-Knoten werden verschmozen. C --Chid--> I --Chid--> T --Chid--> I --Chid--> E --Chid-->S(EOW) ^ Next Next v Y (EOW) P --Chid--> I --Chid--> T --Chid--> I --Chid--> Next v Y (EOW) P. Stader Agorithmen und Datenstrukturen 2 23
Letzter Verschmezungsschritt Nach dem etzten Verschmezungsschritt: C --Chid--> I --Chid--> T --Chid--> I --Chid--> E --Chid-->S(EOW) Next Next v Y (EOW) P --Chid---- P. Stader Agorithmen und Datenstrukturen 2 24
Dateiformat (byteweise) Darsteung der Knoten as 4-Byte-Datensätze: (2 Byte) Verweis auf ersten Chid-Knoten (1 Byte) Fags für EOW und etzten Knoten in Next-Kette (1 Byte dafür ist Verschwendung!) (1 Byte) Buchstabe des Knotens Wir benötigen keine Pointer für die Next-Liste, wei diese physich unmittebar hinter dem ersten Chid-Knoten gespeichert werden kann. Im CITY-PITY-Beispie erhaten wir: 00 00 03 00 Dummy nu vaue, aows 0 to indicate no chid 00 03 00 43 C, chid at 4-byte-word #3 00 03 02 50 P, chid at 4-byte-word #3, end-of-ist 00 04 00 49 I, chid at 4-byte-word #4 00 05 00 54 T, chid at 4-byte-word #5 00 06 00 49 I, chid at 4-byte-word #7 00 00 03 59 Y, no chid, end-of-word, end-of-ist 00 08 00 45 E, chid at 4-byte-word #8 00 00 03 53 S, no chid, end-of-word, end of ist P. Stader Agorithmen und Datenstrukturen 2 25
Dateiformat (bitweise) Angenommen, wir woen Wörter ohne Berücksichtigung der Groß- und Keinschreibung speichern (z.b. für Rechtschreibkontroe) Wir betrachten die 4 Byte as 32 bit und verwenden sie fogendermaßen: 25 bit für die Knoten-Adresse 2 bit für die Fags 5 bit für die Buchstaben (32 Buchstaben, evt. mehr ganz setene Zeichen mit Escape-Sequenz) Das ermögicht 33 Miionen Knoten, ausreichend für eine normae Sprache. Eine Sortierung der Knoten in einer Next-Kette entsprechend der Häufigkeit eraubt zusätzich eine Bescheunigung bei der Suche. P. Stader Agorithmen und Datenstrukturen 2 26
Wohin mit Angaben zu Wörtern? Fas wir Angaben zu Wörtern einfach hinten anfügen und diese nicht zur Struktur passen, geht die Komprimierbarkeit an den Wortenden veroren. Außer in dem Fa, dass geiche Wortenden häufig geiche Angaben impizieren. Beispiee dafür sind: Grammatikangaben zu Wörtern, z.b. Umeitung f. Das komprimiert wieder gut, da fast ae Wörter auf...ung weibich sind, aso die Darsteung...ung f haben. Angaben zur Grundformreduktion: Das Format der Regen sei nstring, wobei zur Transformation auf Grundform zuerst hinten n Zeichen entfernt werden und dann (ggf.) string angefügt wird. Aso z.b. Tassen 1, Hochhäuser 5haus. Wortpaare mit Übergangswahrscheinichkeiten oder anderen Zahenangaben. Zunächst werden die Zahenangaben diskretisiert. Bester Patz ist zwischen den zwei Wörtern, damit die Kompression von hinten und vorn funktioniert.. P. Stader Agorithmen und Datenstrukturen 2 27
Anwendung: Rechtschreibkontroe Aufgabensteung: Für ein gegebenes Wort so festgestet werden, ob es in einer gegebenen Wortiste ist. Wenn nicht, soen die ähnichsten Wörter aus der Wortiste vorgeschagen werden. Lösung: Die Wortiste wird as DAWG gespeichert, für ein vorgegebenes Wort kann entschieden werden, ob es sich in der Liste befindet. Es werden zur Eingabe ähniche Strings erzeugt und in der Liste gesucht. Fas sie vorhanden sind, handet es sich (per Definition) um ähniche Wörter. Ähniche Strings entstehen, indem man einen oder zwei (seten auch mehrere) der fogenden Editierschritte ausführt. In Kammern die Anzah der so erzeugten Vorschäge für ein Wort aus n Buchstaben und 30 Buchstaben im Aphabet. Wegassen eines Buchstaben [Anzah: n] Einfügen eines Buchstaben an einer beiebigen Stee [Anzah: 30(n+1)] Austauschen eines Buchstaben an einer beiebigen Stee [Anzah: 29n] Vertauschen zweier benachbarter Buchstaben [Anzah: n-1] Sprachspezifische Ersetzungen wie f-ph, ss-ß, ö-oe,... P. Stader Agorithmen und Datenstrukturen 2 28
Prays the Lord for the speing chequer That came with our pea sea! Mecca mistake and it puts you rite Its so easy to ewes, you sea. I never used to no, was it e before eye? (Four sometimes its eye before e.) But now I've discovered the quay to success It's as simpe as won, too, free! Sew watt if you ose a etter or two, The whired won't come two an end! Can't you sea? It's as pane as the knows on yore face S. Chequer's my very best friend I've aways had trubbe with etters that doube "Is it one or to S's?" I'd wine But now, as I've toed you this chequer is grate And its hi thyme you got won, ike mine. An Ode to the Speing Chequer Von Janet E. Byford Gefunden auf: http://www.cooper.com/ aan/homonym.htm P. Stader Agorithmen und Datenstrukturen 2 29