Algorithmen und Datenstrukturen 2-3. Seminar - Dominic Rose Bioinformatics Group, University of Leipzig Sommersemster 2010
Outline 3. Übungsserie: 3 Aufgaben, insgesamt 30 Punkte A7 Huffmann-Codierung (14 Punkte) A8 LZ77 (8 Punkte) A9 Burrows-Wheeler Transform (8 Punkte)
Wiederholung: Datenkompression Erreicht durch günstige Repräsentation der Daten wobei Redundanz vermieden und Entropie erhöht wird Aber: Auch durch Weglassen von Information! Verlustfrei: Daten können originalgetreu wiederhergestellt werden. Reduktion von Redundanz. Verlustbehaftet: Daten können nicht wieder vollständig rekonstruiert werden. Verlustbehaftete Kompression reduziert Information. Entbehrliche Information wird weggelassen. Durch Informationsverlust kann die ursprüngliche Information aber nicht exakt wiederhergestellt werden. Verschiedene Verfahren erzeugen unterschiedlich hohe Kompressionsraten.
Einsatzgebiete: Wiederholung: Datenkompression Speicherung von Bildern, Ton, Film Meist verlustbehaftete Kompression. zb JPEG: Unschärfe, Artefakte usw
Wiederholung: Datenkompression Game Boy Advance Game Boy Advance GBA vs. Photoshop
Wiederholung: Datenkompression Einsatzgebiete: Speicherung von Text oft Einsparung von 80-90% der Originalgröße möglich simpel: Lauflängencodierung: AAAAA 5A z.b. Bioinformatik. Erbgut des Menschen, chr21: 46M GAATATTTTAGATATTGGGGTTGTTTTTTAGTTGAAATAATAAGCGGTTT TACCGAGTTGCCAGTAGTGGTTTAACATTGAAGATAATTTAACATTCATG ATTTTGTGAGTTTAATTTATTAGCTCTATAAGGGTTGTTTAAGTACTCTG AAGGCTTTATTTGTTAGTCCGATAATTAAAATGTTCATAAAGATAATTCA ACATATTAAATTTGTAAATGTAGTTTAAAATCTTTAAGGGAGTTTAATTA gzip: 46M 11M
Wiederholung: Datenkompression Kompression durch Codierung Aber: Wird z. B. das Zeichen A mit der Bitfolge 10, das Zeichen B mit der Folge 01 und C mit 0 codiert, dann wird die Zeichenkette ABC zu 10010. Diese Folge wird aber auch von der Zeichenkette ACA erzeugt. Es ist also nicht mehr eindeutig erkennbar, für welche Zeichenfolge die Bitfolge 10010 steht. Mehrdeutigkeit verhindern: präfixfreie Codes! d. h. keine Bitfolge, die für ein einzelnes Zeichen steht, darf am Anfang eines anderen Zeichens stehen. War im Beispiel nicht erfüllt, da die Bitfolge 0 (C), am Anfang der B zugewiesenen Folge steht. Wie kann nun ein präfixfreier Code erzeugt werden?
Wiederholung: Datenkompression Grundidee: Repräsentiere Code mittels Binär-Baum (Trie bzw. Präfixbaum). Blätter stehen für die zu kodierenden Zeichen Pfad von der Wurzel zum Blatt bestimmt die Bitfolge. Problem: Wie erstellt man solch einen Baum effizient? Welche Eigenschaften muss ein guter Code (der Baum) haben?
Wiederholung: Datenkompression Verschiedene Verfahren zur Berechnung eines solchen Baumes, z.b. Shannon-Fano Huffman
Shannon-Fano: Wiederholung: Datenkompression Zeichen mit ähnlichen Wahrscheinlichkeiten enden oft im selben Teilbaum; L(C) = mittlere Codewortlänge
Wiederholung: Datenkompression Shannon-Fano nicht immer optimal. Huffman liefert beweisbar immer einen optimalen Baum für gegebene Wahrscheinlichkeiten:
Aufgabe 7 Gegeben seien die Zeichenketten S 1 = HASEN ABER HABEN ALLE ALLELE S 2 = ANANASSAHNE AN NASE
Aufgabe 7 Gegeben seien die Zeichenketten S 1 = HASEN ABER HABEN ALLE ALLELE S 2 = ANANASSAHNE AN NASE a) Zählen Sie separat in S 1 und S 2 die Häufigkeiten der Zeichen und geben Sie diese in je einer Tabelle für S 1 und S 2 an. Versichern Sie Sich, dass Ihre Zählung stimmt, damit Sie die beiden folgenden Teilaufgaben auch richtig lösen können. (2 Punkte)
Aufgabe 7 Gegeben seien die Zeichenketten S 1 = HASEN ABER HABEN ALLE ALLELE S 2 = ANANASSAHNE AN NASE a) Zählen Sie separat in S 1 und S 2 die Häufigkeiten der Zeichen und geben Sie diese in je einer Tabelle für S 1 und S 2 an. Versichern Sie Sich, dass Ihre Zählung stimmt, damit Sie die beiden folgenden Teilaufgaben auch richtig lösen können. (2 Punkte) S 1 : S 2 : A B E H L N R S 4 5 2 6 2 5 2 1 1 A E H N S 2 6 2 1 5 3
Aufgabe 7 b) Konstruieren Sie anhand der in S 1 und S 2 ermittelten Häufigkeiten die entsprechenden Huffman-Codierungs-Bäume T 1 und T 2. Gibt es mehr als einen Baum mit minimaler Häufigkeit, so wird jeweils derjenige ausgewählt, der das am frühesten im Alphabet erscheinende Zeichen enthält. Das Leerzeichen kommt alphabetisch vor A. (6 Punkte)
Aufgabe 7 S 1 : A B E H L N R S S 2 : A E H N S 4 5 2 6 2 5 2 1 1 2 6 2 1 5 3
Aufgabe 7 S 1 : A B E H L N R S S 2 : A E H N S 4 5 2 6 2 5 2 1 1 2 6 2 1 5 3
Aufgabe 7 c) Kodieren Sie die Zeichenkette S 1 mit T 1 ; und kodieren Sie die Zeichenkette S 2 sowohl mit T 1 als auch mit T 2. (6 Punkte) Codes von T 1 : =100, A=110, B=1010, E=00, H=1011, L=01, N=1111, R=11100, S=11101 S 1 = HASEN ABER HABEN ALLE ALLELE kodiert mit T 1 : 1011 110 11101 00 1111 100 110 1010 00 11100...
Aufgabe 7 S 2 = ANANASSAHNE AN NASE Codes von T 1 : =100, A=110, B=1010, E=00, H=1011, L=01, N=1111, R=11100, S=11101 S 2 kodiert mit T 1 : 110 1111 110 1111 110 11101 11101 110... 67 bits Codes von T 2 : =0001, A=11, E=001, H=0000, N=10, S=01 S 2 kodiert mit T 2 : 11 10 11 10 11 01 01 11 0000 10 001 0001 11 10 0001... 46 bits
Langweilig? Motivation: Telefax: Huffman + Lauflängenkodierung Um nicht für jedes Fax einen neuen Codebaum erzeugen und übertragen zu müssen wurden typische Faxseiten analysiert und Häufigkeitstabelle von typischen schwarz/weißen Punktfolgen erstellt. Daraus Codetabelle mittels Huffman-Algorithmus erzeugt und fest in die Faxgeräte integriert. z.b. 20 aufeinander folgende weiße Bildpunkte werden mit 0001000 codiert. Statt 20 Bit bei einzelner Übertragung müssen hier nur 7 Bit übertragen werden. Eingesparte Datenmenge und Übertragungszeit: ca. 5-20%.
Wiederholung: LZW Lempel-Ziv-Welch, z. B. in gif Wörterbuchverfahren (wie alle LZ-Varianten) Prinzip: Häufige Motive durch Code ersetzen, indem nach und nach ein Wörterbuch aufgebaut wird. Das Wörterbuch wird mit ASCII-Tabelle initialisiert (256 Zeichen). Die zu komprimierende Datei wird in Byte-Ketten aufgeteilt, jede dieser Ketten wird mit dem Wörterbuch verglichen und hinzugefügt, falls sie nicht vorhanden ist. Vorteil: Wörterbuch (bis auf ASCII-Tabelle) wird zur Laufzeit erstellt.
Beispiel: Wiederholung: LZW
Wiederholung: LZW Beispiel: Kompression (im Wörterbuch steht bereits 1: A, 2: B, 3: C): Bei der Kompression wird zum nächsten Eingabetext eine möglichst lange Zeichenkette im Wörterbuch gesucht und als Index ausgegeben. Die Zeichenkette zusammen mit dem ersten nicht passenden Zeichen wird in das Wörterbuch übernommen.
Wiederholung: LZW Beispiel: Dekompression (im Wörterbuch steht bereits 1: A, 2: B, 3: C):
Wiederholung: LZ77 sliding window Verfahren. Fenster beliebiger konstanter Größe wird in einen Vorschau-Puffer und ein Text-Feld (Wörterbuch) eingeteilt. Das Fenster wandert über den zu komprimierenden Text, wobei der Inhalt des Vorschau-Puffers zu komprimieren ist und im Wörterbuch bereits komprimierte Zeichenketten liegen, die wieder nachgeschlagen werden.
Wiederholung: LZ77
Wiederholung: LZ77 Beispiel: Komprimieren des Wortes ANANAS (8 Zeichen großes Wörterbuch, 4 Zeichen Vorschau-Puffer) Wikipedia-Version (!= Vorlesung *g*)
Wiederholung: LZ77 Beispiel: Dekomprimieren des Wortes ANANAS (8 Zeichen großes Wörterbuch, 4 Zeichen Vorschau-Puffer) Wikipedia-Version (!= Vorlesung *g*)
Wiederholung: LZ77 Beispiel: Dekomprimieren des Wortes ANANAS (8 Zeichen großes Wörterbuch, 4 Zeichen Vorschau-Puffer) Wikipedia-Version (!= Vorlesung *g*)
Wiederholung: LZ77 Vorlesungskonform(er): http://de.wikibooks.org/wiki/datenkompression
Aufgabe 8 Wenden Sie den Algorithmus LZ77 (Sliding Window Lempel-Ziv ohne Optimierungen, laut Vorlesung) auf S 1 und auf S 2 an. Der Buffer fasse 4 Zeichen. Geben Sie die erzeugte Ausgabe bei Längen 5 und 15 des Dictionary jeweils für die Zeichenketten S 1 und S 2 an. Sie müssen also insgesamt vier Läufe des LZ77 durchführen. (8 Punkte)
Aufgabe 8 S 1 = HASEN ABER HABEN ALLE ALLELE, buffer=4, dict=5, LZ77?
Aufgabe 8 S 1 = HASEN ABER HABEN ALLE ALLELE, buffer=4, dict=5 01 HASE N_ABER_HABEN_ALLE_ALLELE (0,0,H) 02 H ASEN _ (0,0,A) 03 HA SEN_ A (0,0,S) 04 HAS EN_A B (0,0,E) 05 HASE N_AB E (0,0,N) 06 HASEN _ABE R (0,0,_) 07 ASEN_ ABER _ (5,1,B) 08 EN_AB ER_H H (5,1,R) 09 _ABER _HAB E (5,1,H) 10 BER_H ABEN _ (0,0,A) 11 ER_HA BEN_ A (0,0,B) 12 R_HAB EN_A L (0,0,E) 13 _HABE N_AL L (0,0,N) 14 HABEN _ALL E (0,0,_) 15 ABEN_ ALLE _ (5,1,L) 16 EN_AL LE_A L (1,1,E) 17 _ALLE _ALL E (5,4,E) 18 _ALLE LE (2,2,eof)
Aufgabe 8 S 1 = HASEN ABER HABEN ALLE ALLELE, buffer=4, dict=15 01 HASE N_ABER_HABEN_ALLE_ALLELE (0,0,H) 02 H ASEN _ (0,0,A) 03 HA SEN_ A (0,0,S) 04 HAS EN_A B (0,0,E) 05 HASE N_AB E (0,0,N) 06 HASEN _ABE R (0,0,_) 07 HASEN_ ABER _ (5,1,B) 08 HASEN_AB ER_HA B (5,1,R) 09 HASEN_ABER _HAB E (5,1,H) 10 HASEN_ABER_H ABEN _ (6,3,N) 11 ASEN_ABER_HABEN _ALL E (11,2,L) 12 N_ABER_HABEN_AL LE_A L (1,1,E) 13 ABER_HABEN_ALLE _ALL E (5,4,E) 14 R_HABEN_ALLE_ALLE LE (2,2,eof) Vorher 18 Codier-Vorgänge!
Aufgabe 8 S 2 = ANANASSAHNE AN NASE, buffer=4, dict=5, LZ77?
Aufgabe 8 S 2 = ANANASSAHNE AN NASE, buffer=4, dict=5 01 ANAN ASSAHNE_AN_NASE (0,0,A) 02 A NANA S (0,0,N) 03 AN ANAS S (2,3,S) 04 NANAS SAHN E (1,1,A) 05 NASSA HNE_ A (0,0,H) 06 ASSAH NE_A N (0,0,N) 07 SSAHN E_AN _ (0,0,E) 08 SAHNE _AN_ N (0,0,_) 09 AHNE_ AN_N A (5,1,N) 10 NE_AN _NAS E (3,1,N) 11 _AN_N ASE (4,1,S) 12 N_NAS E (0,0,E)
Aufgabe 8 S 2 = ANANASSAHNE AN NASE, buffer=4, dict=15 01 ANAN ASSAHNE_AN_NASE (0,0,A) 02 A NANA S (0,0,N) 03 AN ANAS S (2,3,S) 04 ANANAS SAHN E (1,1,A) 05 ANANASSA HNE_ A (0,0,H) 06 ANANASSAH NE_A N (6,1,E) 07 ANANASSAHNE _AN_ N (0,0,_) 08 ANANASSAHNE_ AN_N A (10,2,_) 09 ANANASSAHNE_AN_ NASE (12,3,E) 12 vs. 9 Codier-Vorgänge!
Aufgabe 8 LZ77: Die Kompressionsgüte ist direkt vom Lexikon abhängig. Um gute Kompressionsraten zu erhalten, muss das Fenster eine gewisse Mindestgröße erreichen. Da aber der zu komprimierende Text mit jedem Eintrag im Lexikon verglichen werden muss, steigt die zum Komprimieren benötigte Zeit mit der Größe des Fensters stark an. LZ77 (LZSS) + Huffman deflate, zlib (gzip), PNG,...
Burrows-Wheeler Transform (BWT) Komprimiert nicht selbst! BWT nutzt Tatsache aus, dass viele Worte/Silben in natürlicher Sprache mit nur wenigen Buchstaben begonnen werden Gleichartige Silben werden zusammensortiert. Diese können dann wieder mit bekannten Algorithmen komprimiert werden
Burrows-Wheeler Transform (BWT) (Achtung: VL-konform nach links rotieren *g*)
Burrows-Wheeler Transform (BWT)
Burrows-Wheeler Transform (BWT)
Aufgabe 9 Wenden Sie die Burrows-Wheeler-Transformation auf S 1 und S 2 an. Geben Sie als Zwischenergebnis die Sortierung der Teilstrings an, entweder in Form der Matrix mit allen rotierten Versionen der Zeichenketten nach alphabetischer Sortierung (vgl. Vorlesung) oder (platzsparender), durch Angabe des Sortierranges bei jedem Zeichen in den Original-Zeichenketten S 1 und S 2. Geben Sie als Endergebnis die permutierten Zeichenketten und die Zeilennummer des Originalblocks an. Die Zeilennummerierung beginne bei 0. (8 Punkte)
Aufgabe 9 - S 1 (Index=18) unsortiert sortiert Index Anfang Ende Index Anfang Ende 0 HASEN E 5 N 1 ASEN H 16 N 2 SEN A A 21 E 3 EN A S 10 R 4 N ABE E 12 A H 5 ABER N 6 A 6 ABER 17 A 7 BER A 22 A 8 ER HA B 1 A H 9 R HAB E 13 B A 10 HABE R 7 B A 11 HABEN 20 E L 12 ABEN H 27 E L 13 BEN A 25 E L 14 EN AL B 3 E S 15 N ALL E 14 E B 16 ALLE N 8 E B 17 ALLE 11 H 18 LLE A 0 H E 19 LE A L 19 L L 20 E ALL L 26 L E 21 ALLEL E 24 L L 22 ALLEL 18 L A 23 LLELE A 23 L A 24 LELEH L 4 N E 25 ELEHA L 15 N E 26 LEHASS E 9 R E 27 EHASE L 2 S A
Aufgabe 9 - S 2 (Index=4) unsortiert sortiert Index Anfang Ende Index Anfang Ende 0 ANAN E 11 A E 1 NAN A 14 N N 2 ANAS N 7 AHN S 3 NASS A 12 AN 4 ASS N 0 ANAN E 5 SSA A 2 ANAS N 6 SAH S 16 ASE N 7 AHN S 4 ASS N 8 HNE A 10 E N 9 NE H 18 EA S 10 E A N 8 H A 11 AN E 13 N A 12 AN 1 NAN A 13 N N A 15 NASE 14 NA N 3 NASS A 15 NASE 9 NE H 16 ASE N 6 SA S 17 SEA A 17 SE A 18 EAN S 5 SS A
BWT - Dekodieren Gegeben: Text: a!iepdwkii, Index: 2
BWT - Dekodieren
BWT - Dekodieren Wikipedia!
VL-8, Seite 8, Boyer-Moore inkonsistenter Pseudo-code: So wie der Algorithmus auf der Folie steht, muss man die last-tabelle ab null indizieren, Text und Muster aber ab eins. Der last-wert fuer ein Zeichen, das ganz am Anfang des Musters einmalig auftaucht, muss ja um eins groesser sein als für ein im Muster gar nicht vorhandenes (-1).
VL-8, Seite 8, Boyer-Moore i=1; while(i<=n-m) { j=m; while( (j>=1)&&(q[j]==t[i+j-1]) ) j--; if(j<1) return i; /* match */ else i = (i+j-1)-last[t[i+j-1]]; } return -1; /* mismatch */
Outlook Suffix-Trees (-Arrays) Knuth-Morris-Pratt Boyer-Moore Bioinformatik (DP, Alignment)