Gliederung Algorithmen und Datenstrukturen II Algorithmen zur Textverarbeitung II D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg 1 Sommer 2009, 18. Mai 2009, c 2009 D.Rösner D. Rösner AuD II 2009... 1 D. Rösner AuD II 2009... 2 Problem: Problem: Vergleichen von Textdateien im Hinblick auf Ähnlichkeit bzw. Unterschiede ist häufig erforderlich Software-Engineering: Vergleich bzgl. Gemeinsamkeiten bzw. Unterschiede zweier Versionen von Programmcode Bioinformatik: Vergleich von DNA-Sequenzen in UNIX-Systemen und LINUX existiert dafür das Programm diff s.a. [GT06], Ch. 12.5 formale Definition des Problems Für einen String X = x 0 x 1 x 2..x n 1 liegt eine Teilsequenz vor, wenn es sich um einen String der Form x i1 x i2...x ik handelt mit i j < i j+1 m.a.w.: aus X sind Zeichen ausgewählt, die zwar nicht notwendig benachbart, aber in der Anordnung wie in X sind. Beispiel: String: CGATAATTGAGA eine Teilsequenz: AAAG Wie gewonnen?... s.a. [GT06], Ch. 12.5.1 D. Rösner AuD II 2009... 4 D. Rösner AuD II 2009... 5
Problem: Problem: Beachte: Jeder Teilstring ist auch Teilsequenz. Für einen String der Länge n gibt es 2 n Teilsequenzen. Begründung: s.a. [GT06], Ch. 12.5.1 Das, d.h. das Problem der längsten gemeinsamen Teilsequenz Gegeben: ein Alphabet Strings X = x 0 x 1 x 2..x n 1 und Y = y 0 y 1 y 2..y m 1 über diesem Alphabet Gesucht: ein String S maximaler Länge, der sowohl Teilsequenz von X als auch Teilsequenz von Y. s.a. [GT06], Ch. 12.1.1 D. Rösner AuD II 2009... 6 D. Rösner AuD II 2009... 7 eine Lösung mit Brachialgewalt ( brute force ): Bestimme alle Teilsequenzen von X. Bestimme alle Teilsequenzen von Y. Bilde den Durchschnitt dieser Mengen und bestimme davon die längsten Elemente. modifizierte Lösung mit Brachialgewalt ( brute force ): Bestimme alle Teilsequenzen von X. Überprüfe für jede, ob sie auch Teilsequenz von Y. Nimm die längste (bzw. eine derjenigen mit maximaler Länge), die auch Teilsequenz von Y. Der Abgleich, ob eine Teilsequenz von X auch Teilsequenz von Y erfordert O(m). Damit: O(2 n m), d.h. exponentieller Aufwand (s.o.) s.a. [GT06], Ch. 12.5.1 D. Rösner AuD II 2009... 8 D. Rösner AuD II 2009... 9
Greedy-Verfahren helfen beim nicht weiter Beispiel: Sei X = ABCD und Y = BCDA.... s.a. [Edm08], Ch. 19.1 eine effiziente Lösung des s ergibt sich aber mit Hilfe des sog. dynamischen Programmierens hierfür zentral: Bildung von Teilproblemen, Untersuchung ihrer Zusammenhänge d.h. möglichst Bestimmung von sog. Rekurrenz-Beziehungen D. Rösner AuD II 2009... 10 D. Rösner AuD II 2009... 11 dynamisches Programmieren für Ansatz zur Bildung von Teilproblemen: Sei L[i,j] die Länge eines Strings, der längste Teilsequenz sowohl von X[0..i] als auch von Y[0..j]. Frage: In welcher Beziehung steht L[i,j] zu Lösungen kleinerer Teilprobleme? Frage: In welcher Beziehung steht L[i,j] zu Lösungen kleinerer Teilprobleme? Beispiel zur Illustration: Y = CGATAATTGAGA X = GTTCCTAATA Gesucht: L[9,11] D. Rösner AuD II 2009... 12 D. Rösner AuD II 2009... 13
beim Versuch, die Bestimmung von L[i,j] auf kleinere Probleme (d.h. solche mit kleineren Indices) zurückzuführen, unterscheiden wir: 1. Fall: x i = y j 2. Fall: x i y j 1. Fall: x i = y j Behauptung: x i und y j gehören dann beide zu einer längsten gemeinsamen Teilsequenz von X[0..i] und Y[0..j]. Fragen: Warum gilt diese Behauptung? Wie hilft sie uns, das Problem der Bestimmung von L[i,j] auf kleinere Probleme zurückzuführen? D. Rösner AuD II 2009... 14 D. Rösner AuD II 2009... 15 1. Fall: x i = y j Behauptung: x i = y j gehören dann beide zu einer längsten Teilsequenz von sowohl X[0..i] als auch Y[0..j]. Begründung: Sei für k 1 o.b.d.a. x i1 x i2...x ik = y j1 y j2...y jk [*] eine längste gemeinsame Teilsequenz. Wenn x ik = x i oder y jk = y j, dann ergibt sich die gleiche Teilsequenz durch Setzen von i k = i und j k = j. x i1 x i2...x ik 1 = y j1 y j2...y jk 1 ist falls existent längste Teilsequenz von X[0..i-1] und von Y[0..j-1]. Wenn x ik x i und y jk y j, dann würde sich eine noch längere gemeinsame Teilsequenz durch Anfügen von x i = y j ans Ende von [*] ergeben. Insgesamt: für x i = y j gilt L[i,j] = L[i-1,j-1] + 1 D. Rösner AuD II 2009... 16 2. Fall: x i y j Dann: es kann keine gemeinsame Teilsequenz geben, die sowohl x i als auch y j enthält Eine gemeinsame Teilsequenz, die x i enthält, ist bereits Teilsequenz von Y[0..j-1] und umgekehrt ist eine gemeinsame Teilsequenz, die y j enthält, bereits Teilsequenz von X[0..i-1] Damit: für x i y j ist die Länge der längsten gemeinsamen Teilsequenz gegeben als das Maximum von L[i-1,j] und L[i,j-1] als Formel: L[i, j] = max(l[i 1, j], L[i, j 1]) D. Rösner AuD II 2009... 17
Frage: In welcher Beziehung steht L[i,j] zu Lösungen kleinerer Teilprobleme? Beispiel zur Illustration: Y = CGATAATTGAG X = GTTCCTAATA Gesucht: L[9,10] mit x 9 y 10 L[9,9] =...? L[8,10] =...? zur Initialisierung folgende Setzung für die Grenzfälle i = 0 oder j = 0 : L[i,-1] = 0 für i = -1,0,1,..., n-1 L[-1,j] = 0 für J = -1,0,1,..., m-1 D. Rösner AuD II 2009... 18 D. Rösner AuD II 2009... 19 Zusammenfassung: das Gesamtproblem lässt sich rekursiv in einfachere Teilprobleme zerlegen eine optimale Lösung des globalen Problems muss sich aus optimalen Lösungen von Subproblemen ergeben (sog. Optimalitätsprinzip) nicht direkt verbundene Teilprobleme können gemeinsame Teilprobleme enthalten hier: L[i,j] kann beitragen zu L[i+1,j], L[i,j+1] und L[i+1,j+1] optimale Lösungen von Subproblemen werden memoisiert 0 0............ 1 0............ 2 0............ 3 0............ 4 0............ 5 0............ 6 0............ 7 0............ 8 0............ 9 0............ Abbildung: Initialisierung eines Array zur Lösung des s für Y = CGATAATTGAGA und X = GTTCCTAATA (s.a. [GT06], Fig. 12.13) D. Rösner AuD II 2009... 20 D. Rösner AuD II 2009... 21
G 0 0 0 1.......... T 1 0............ T 2 0............ C 3 0............ C 4 0............ T 5 0............ A 6 0............ A 7 0............ T 8 0............ A 9 0............ Abbildung: Füllen des Arrays (s.a. [GT06], Fig. 12.13) T 1 0............ T 2 0............ C 3 0............ C 4 0............ T 5 0............ A 6 0............ A 7 0............ T 8 0............ A 9 0............ Abbildung: Füllen des Arrays (s.a. [GT06], Fig. 12.13) D. Rösner AuD II 2009... 22 D. Rösner AuD II 2009... 23 T 1 0 0 1 1 2........ T 2 0............ C 3 0............ C 4 0............ T 5 0............ A 6 0............ A 7 0............ T 8 0............ A 9 0............ Abbildung: Füllen des Arrays (s.a. [GT06], Fig. 12.13) T 1 0 0 1 1 2 2 2 2 2 2 2 2 2 T 2 0 0 1 1 2 2 2 3 3 3 3 3 3 C 3 0 1 1 1 2 2 2 3 3 3 3 3 3 C 4 0 1 1 1 2 2 2 3 3 3 3 3 3 T 5 0 1 1 1 2 2 2 3 4 4 4 4 4 A 6 0 1 1 2 2 3 3 3 4 4 5 5 5 A 7 0 1 1 2 2 3 4 4 4 4 5 5 6 T 8 0 1 1 2 3 3 4 5 5 5 5 5 6 A 9 0 1 1 2 3 4 4 5 5 5 6 6 6 Abbildung: Gefülltes Array für (s.a. [GT06], Fig. 12.13) D. Rösner AuD II 2009... 24 D. Rösner AuD II 2009... 25
Frage: Welche Reihenfolgen beim Befüllen des Arrays mit den L[i,j]-Werten sind möglich? Wie ist der Aufwand für die Bestimmung der Werte im Array mit den L[i,j]-Werten? mit dem Array der L[i,j]-Werte kennen wir die Länge einer längsten gemeinsamen Teilsequenz zweier Strings um eine längste Teilsequenz zu gewinnen, kann man diese wie folgt aus dem Array der L[i,j]-Werte auslesen man beginnt in L[n,m] in jeder Position [i,j] kann überprüft werden, ob x i = y j. Trifft dies zu, dann nimm x i zum Ergebnis und gehe zu Position [i-1,j-1]. Für x i y j gehe zu derjenigen der Positionen [i,j-1] bzw. [i-1,j] mit dem grösseren L-Wert. (Sonst...?) Beende, wenn eine Randzelle erreicht (also i = 1 oder j = 1) Aufwand für solches Auslesen im schlechtesten Fall? D. Rösner AuD II 2009... 26 D. Rösner AuD II 2009... 27 T 1 0 0 1 1 2 2 2 2 2 2 2 2 2 T 2 0 0 1 1 2 2 2 3 3 3 3 3 3 C 3 0 1 1 1 2 2 2 3 3 3 3 3 3 C 4 0 1 1 1 2 2 2 3 3 3 3 3 3 T 5 0 1 1 1 2 2 2 3 4 4 4 4 4 A 6 0 1 1 2 2 3 3 3 4 4 5 5 5 A 7 0 1 1 2 2 3 4 4 4 4 5 5 6 T 8 0 1 1 2 3 3 4 5 5 5 5 5 6 A 9 0 1 1 2 3 4 4 5 5 5 6 6 6 Abbildung: Auslesen einer Lösung für (s.a. [GT06], Fig. 12.13) T 1 0 0 1 1 2 2 2 2 2 2 2 2 2 T 2 0 0 1 1 2 2 2 3 3 3 3 3 3 C 3 0 1 1 1 2 2 2 3 3 3 3 3 3 C 4 0 1 1 1 2 2 2 3 3 3 3 3 3 T 5 0 1 1 1 2 2 2 3 4 4 4 4 4 A 6 0 1 1 2 2 3 3 3 4 4 5 5 5 A 7 0 1 1 2 2 3 4 4 4 4 5 5 6 T 8 0 1 1 2 3 3 4 5 5 5 5 5 6 A 9 0 1 1 2 3 4 4 5 5 5 6 6 6 Abbildung: Beginn des Auslesen einer alternativen Lösung für ; Komplettieren als Übung D. Rösner AuD II 2009... 28 D. Rösner AuD II 2009... 29
Weitere Beispiele: längste ansteigende Subsequenz mit benachbarten Elementen längste ansteigende Subsequenz Bestimmung aller kürzesten Pfade in einem Graphen s.a. [Edm08], Ch. 19.1 Längste ansteigende benachbarte Subsequenz Sei eine Sequenz A[1..n] von Integers gegeben und gesucht ist die längste Subsequenz unmittelbar benachbarter Elemente A[k 1, k 2 ], so dass die Elemente monoton nicht fallen. Beispiel: Was ist eine Lösung für [5,3,1,3,7,9,8]? s.a. [Edm08], Ex. 19.2.1 D. Rösner AuD II 2009... 31 D. Rösner AuD II 2009... 32 Längste ansteigende benachbarte Subsequenz Fragen Wie sieht eine Lösung mit brute force aus? Wie gewinnt man eine Lösung mit dynamischem Programmieren? s.a. [Edm08], Ex. 19.2.1 Längste ansteigende Subsequenz Sei wieder eine Sequenz A von n Integers gegeben. Gesucht ist die längste (nicht notwendigerweise aus benachbarten Elementen bestehende) Subsequenz S A[1..n], so dass die Elemente, in der Ordnung, in der sie in A erscheinen, monoton nicht fallend sind. Beispiel: für [5,1,5,7,2,4,9,8] ist [1,5,7,9] eine optimale Lösung, aber auch [1,2,4,8] oder [1,2,4,9] oder... s.a. [Edm08], Ex. 19.2.2 D. Rösner AuD II 2009... 33 D. Rösner AuD II 2009... 34
Literatur: I Längste ansteigende Subsequenz Fragen Wie sieht eine Lösung mit brute force aus? Wie gewinnt man eine Lösung mit dynamischem Programmieren? s.a. [Edm08], Ex. 19.2.2 Jeff Edmonds. How to Think about Algorithms. Cambridge University Press, New York, USA, 2008. ISBN 978-0-521-61410-8 (pbk.). Michael T. Goodrich and Roberto Tamassia. Data Structures and Algorithms in Java. John Wiley & Sons, New York, 2006. ISBN-10 0-471-73884-0; ISBN-13 978-0-471-73884-8;4th edition. D. Rösner AuD II 2009... 35 D. Rösner AuD II 2009... 36