Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Konstruktion von Suffixarrays in linearer Zeit Vortrag im Seminar Mehr Algorithmische Bioinformatik von Marek Karadžić SS 2005 Leiter: Prof. Dr. Ulf Leser.

Ähnliche Präsentationen


Präsentation zum Thema: "Konstruktion von Suffixarrays in linearer Zeit Vortrag im Seminar Mehr Algorithmische Bioinformatik von Marek Karadžić SS 2005 Leiter: Prof. Dr. Ulf Leser."—  Präsentation transkript:

1 Konstruktion von Suffixarrays in linearer Zeit Vortrag im Seminar Mehr Algorithmische Bioinformatik von Marek Karadžić SS 2005 Leiter: Prof. Dr. Ulf Leser und Dipl.-Inf. Jörg Hakenberg

2 Suffixarrays in linearer Zeit Überblick Kurze Wiederholung Suffixtrees und –arrays Algorithmus von Manber und Myers Beispiel Komplexität Skew-Algorithmus Beispiel Komplexität

3 Suffixarrays in linearer Zeit Zur Erinnerung.. Suffixtrees Exaktes Stringmatching für ein Template und viele Pattern T möglichst clever vorverarbeiten Gut für Datenbankanfragen Naive Konstruktion von Suffixtrees in O(m²); mit Ukkonen in O(m) Schwierigkeiten: Konstruktion schlecht auf Sekundärspeichern (Lokalität) Naive Konstruktion zu langsam Ukkonen ist speicherintensiv; aber typische Anwendungen arbeiten im Hauptspeicher Abhilfe: Suffixarrays

4 Suffixarrays in linearer Zeit Suffixarrays Für einen String s ist A ein Integerarray der Länge |s|, wobei A[i] die Startposition des i-ten, lexikographisch sortierten Suffix von s enthält. Konstruktion aus Suffixtrees in O(m) mit Depth-First-Search Beispiel: A[1] = 9 $ A[2] = 4 AKIRI$ A[3] = 2 ARAKIRI$ A[4] = 1 HARAKIRI$ A[5] = 8 I$ A[6] = 6 IRI$ A[7] = 5 KIRI$ A[8] = 3 RAKIRI$ A[9] = 7 RI$ s = HARAKIRI$

5 Suffixarrays in linearer Zeit Algorithmus von Manber und Myers

6 Suffixarrays in linearer Zeit Der Algorithmus Gegeben ein String s und leeres Array A Array mit allen Suffixen von s, der Länge nach absteigend, initialisieren: A[i] = n +1 – i für i = 0..n Mit Bucket-Sort nach dem ersten Zeichen sortieren Sortieren nach den nächsten Zeichen: s i = s i … s n $ und s j = s j … s n $ sind zwei Wörter eines Buckets Für das zweite Zeichen: s i+1 mit s j+1 vergleichen Danach werden das dritte und vierte Zeichen verglichen, also s i+2 s i+3 mit s j+2 s j+3 Die Anzahl der Zeichen, nach denen verglichen wird, verdoppelt sich in jedem Schritt: 1, 2, 4, 8, 16, … Folgen Suffixe aufeinander, aufgrund von Suffixen aus verschiedenen Buckets, entsteht eine neue Bucketgrenze Wir sind fertig, wenn jedes Suffix in einem eigenen Bucket ist

7 Suffixarrays in linearer Zeit Der Trick Der Vergleich wurde schon implizit im vorherigen Schritt gemacht Für das zweite Zeichen ist es dasselbe Ergebnis wie das beim Vergleich von s i+1 = s i+1 … s n $ mit s j+1 = s j+1 … s n $, also: In jedem Bucket wird s i, nach der Sortierung von s i+1 nach dem ersten Zeichen, angeordnet Dafür gehen wir durch das mit Bucket-Sort sortierte Array und schieben den Index j -1, wenn A[i] = j ist, an den Anfang in seinem Bucket Für das dritte und vierte Zeichen ist es dasselbe Ergebnis wie das beim Vergleich von s i+2 = s i+2 … s n $ mit s j+2 = s j+2 … s n $, also: In jedem Bucket wird s i, nach der Sortierung von s i+2 nach den ersten beiden Zeichen, angeordnet Dafür gehen wir durch das im vorherigen Schritt sortierte Array und schieben den Index j -2, wenn A[i] = j ist, an den Anfang in seinem Bucket

8 Suffixarrays in linearer Zeit Beispiel Array mit allen Suffixen von s in absteigender Reihenfolge initialisieren: A[i] = n +1 – i für i = 0..n s = MISSISSIPPI$ A[0] = 1 MISSISSIPPI$ A[1] = 2 ISSISSIPPI$ A[2] = 3 SSISSIPPI$ A[3] = 4 SISSIPPI$ A[4] = 5 ISSIPPI$ A[5] = 6 SSIPPI$ A[6] = 7 SIPPI$ A[7] = 8 IPPI$ A[8] = 9 PPI$ A[9] = 10 PI$ A[10] = 11 I$ A[11] = 12 $

9 Suffixarrays in linearer Zeit Beispiel II Mit Bucket-Sort nach dem ersten Zeichen sortieren $IMPS A MISSISSIPPI$ $$ I ISSISSIPPI$ ISSIPPI$ IPPI$ I$ MMISSISSIPPI$ P PPI$ PI$ S SSISSIPPI$ SISSIPPI$ SSIPPI$ SIPPI$

10 Suffixarrays in linearer Zeit Beispiel III A $I I I I $ P S S P S S MISMIS P P I P $ I S S S S I I S S S P I I In jedem Bucket wird s i, nach der Sortierung von s i+1 nach dem ersten Zeichen, angeordnet. Dafür gehen wir durch das mit Bucket-Sort sortierte Array und schieben den Index j -1, wenn A[i] = j ist, an den Anfang in seinem Bucket. Folgen Suffixe aufeinander, aufgrund von Suffixen aus verschiedenen Buckets, entsteht eine neue Bucketgrenze.

11 Suffixarrays in linearer Zeit Beispiel IV In jedem Bucket wird s i, nach der Sortierung von s i+2 nach den ersten beiden Zeichen, Angeordnet. Dafür gehen wir durch das im vorherigen Schritt sortierte Array und schieben den Index j -2, wenn A[i] = j ist, an den Anfang in seinem Bucket A $I$I$ IPPI$IPPI$ I I S S S S I I S P MISSIMISSI PI$PI$ PPI$PPI$ S S I I P S P S I I S S S S I I P S P S

12 Suffixarrays in linearer Zeit Komplexität Die Größe des Alphabets ist n, also gibt es höchstens n Buckets Die Verdopplung der Anzahl der Zeichen nach denen sortiert wird, führt zu log(n) Also hat der Algorithmus im schlimmsten Fall eine Laufzeit von O(n · log(n)) Im besten Fall nur O(n)! Worst case kann auf O(n · loglog(n)) reduziert werden

13 Suffixarrays in linearer Zeit Skew-Algorithmus

14 Suffixarrays in linearer Zeit Gut zu wissen 2003 von J. Kärkkäinen und P. Sanders vorgestellt Erster Algorithmus der nur O(n) braucht Im selben Jahr wurden noch zwei weitere Algorithmen zur linearen Konstruktion veröffentlicht P. Ko und A. Aluru D.K. Kim, J.S. Sim, H. Park, K. Park (?)

15 Suffixarrays in linearer Zeit Der Algorithmus 0) String s = s 0 · · · s n-1 1) s[n] = s[n + 1] = s[n + 2] = $; $ kommt in s nicht vor und ist kleinstes Zeichen im Alphabet 2) Tripel von s bilden (s i · s i+1 · s i+2 ) mit Startposition i mod 3 0 3) Tripel werden mit Radix Sort (lexikographisch) sortiert, Ergebnis in einem Array A 12 speichern 4) Jedes Tripel erhält einen lexikographischen Namen. Dazu werden die sortierten Tripel in aufsteigender Reihenfolge durchnummeriert, wobei gleiche Tripel auch gleiche Nummern bekommen.

16 Suffixarrays in linearer Zeit Der Algorithmus II 5) Wir erhalten eine neue Zeichenreihe s (1) bzw. s (2), indem wir für das Teilwort bzw. alle Tripel mit i mod 3 = 1 bzw. i mod 3 = 2 durch ihre Nummer ersetzen. Mit s (1) · s (2) erzeugen wir die Zeichenreihe s 12. 6) Schritte solange mit s 12 · 0 rekursiv aufrufen, bis jedes Tripel einen eindeutigen lexikographischen Namen hat 7) Tripel mit i mod 3 = 0 mittels A 12 anordnen (denn s i+1 mit (i + 1) mod 3 = 1 ist uns bekannt) und mit Radix Sort nach s[i] sortieren; Ergebnis in A 0 speichern

17 Suffixarrays in linearer Zeit Der Algorithmus III 8) Mische A 0 und A 12, dabei gilt, wenn wir s i mit s j mit i mod 3 = 0 und j mod 3 = [1, 2] vergleichen: Fall 1: Ist j mod 3 = 1, dann gilt: s i = s i · s i+1, wobei (i + 1) mod 3 = 1 s j = s j · s j+1, wobei (j + 1) mod 3 = 2 Wir vergleichen s i mit s j, bei Gleichheit Ergebnis aus A 12 ablesen Fall 2: Ist j mod 3 = 2, dann gilt: s i = s i · s i+1 · s i+2, wobei (i + 2) mod 3 = 2 s j = s j · s j+1 · s j+2, wobei (j + 2) mod 3 = 1 Wir vergleichen s i mit s j, bei Gleichheit auch s i+1 mit s j+1. Sind beide gleich, lesen wir das Ergebnis wieder aus A 12 ab

18 Suffixarrays in linearer Zeit Beispiel s = MISSISSIPPI 1) Dummy-Tripel dranhängen s = MISSISSIPPI$$$ 2) Tripel von s mit i mod 3 0 bilden MISSISSIPPI$$$ i mod 3 = 1i mod 3 = 2 ISS IPPI$$SSI PPI$$$ POS

19 Suffixarrays in linearer Zeit Beispiel II 3) Radix Sort $IPS I$$ $$$ PPI IPP SSI SSI ISS ISS $IPS I$$ $$$ SSI SSI PPI IPPISS Von: ISS ISS IPP I$$ SSI SSI PPI $$$ Ergebnis nach r.Z.: I$$, $$$, SSI, SSI, PPI, IPP, ISS, ISS Ergebnis nach m.Z.: I$$, $$$, PPI, IPP, SSI, SSI, ISS, ISS Sortieren nach r.Z.:Sortieren nach m.Z.:

20 Suffixarrays in linearer Zeit Beispiel III 4) Lexikographische Namen (ψ) $IPS $$$I$$ IPP ISS ISS PPISSI Ergebnis nach l.Z.: $$$, I$$, IPP, ISS, ISS, PPI, SSI, SSI i mod 3 = 1 i mod 3 = 2 ψ $$$I$$IPPISS PPISSI POS Sortieren nach l.Z.:

21 Suffixarrays in linearer Zeit Beispiel IV 5) s 12 := s (1) · s (2) 6) Rekursiver Aufruf von s 12 · 0 bis ψ eindeutig ist Tripel i mod 3 0 bilden: POS = s 12 = i mod 3 = 1i mod 3 = POS147258

22 Suffixarrays in linearer Zeit Beispiel V 6.1) Radix Sort.. 7) Tripel mit i mod 3 = 0 sortieren s i+1 mit (i + 1) mod 3 = 1 ist uns durch A 12 bekannt, s[i] mit Radix Sort Ergebnis: 000, 100, 326, 432, 651, 665 (= A 12 ) POS = s 12 = Also: 443, 266, 510 Ergebnis: 266, 443, 510 (= A 0 )

23 Suffixarrays in linearer Zeit Beispiel VI 8) Mischen von A 0 und A 12 mit Hilfe von A 12 POS MISSISSIPPI$$$ POS Ergebnis: 000,100,266,326,432,443,510,651,665(= A 12 ) Fall 1: Ist j mod 3 = 1, dann gilt: s i = s i · s i+1, wobei (i + 1) mod 3 = 1 s j = s j · s j+1, wobei (j + 1) mod 3 = 2 Wir vergleichen s i mit s j, bei Gleichheit Ergebnis aus A 12 ablesen Fall 2: Ist j mod 3 = 2, dann gilt: s i = s i · s i+1 · s i+2, wobei (i + 2) mod 3 = 2 s j = s j · s j+1 · s j+2, wobei (j + 2) mod 3 = 1 Wir vergleichen s i mit s j, bei Gleichheit auch s i+1 mit s j+1. Sind beide gleich, lesen wir das Ergebnis wieder aus A 12 ab

24 Suffixarrays in linearer Zeit Beispiel VII 8.1) Das Gleiche nochmal mit den Tripeln i mod 3 = 0 aus dem allerersten Schritt Sortieren mit Radix Sort und A 12 : Mischen von A 0 und A 12 : MISSISSIPPI$$$ Von: MIS, SIS, SIP, PI$ Ergebnis: MIS, PI$, SIP, SIS (= A 0 ) 100,266,326,432,443,510,651,665 $$$ I$$ IPP ISS ISS PPI SSI SSI MIS PI$ SIP SIS

25 Suffixarrays in linearer Zeit Beispiel VIII Resultat Suffixarray A: A[0] = 11 $$$ A[1] = 10 I$$ A[2] = 7 IPP I$$ A[3] = 4 ISS IPP I$$ A[4] = 1 ISS ISS IPP I$$ A[5] = 0 MIS SIS SIP PI$ A[6] = 9 PI$ A[7] = 8 PPI $$$ A[8] = 6 SIP PI$ A[9] = 3 SIS SIP PI$ A[10] = 5 SSI PPI $$$ A[11] = 2 SSI SSI PPI $$$

26 Suffixarrays in linearer Zeit Komplexität Für einen String der Länge n ruft sich der Algorithmus rekursiv mit 2/3 * n (Startpositionen mit i mod 3 0) auf Danach werden diese 2/3 * n mit den übrigen 1/3 * n Zeichen gemischt, das kostet O(n) Dadurch ergibt sich die Rekursionsgleichung: Da sich der erste Teil zu einer Konstante entwickelt, bleibt der Algorithmus letztendlich linear: T(n) = O(n)

27 Suffixarrays in linearer Zeit Quellen Heun, Volker: Skript zur Vorlesung Algorithmen auf Sequenzen. Version 0.70 (03/2005) Weese, David: Studienarbeit zur Implementierung des Skew-Algorithmus. (05/2005) J. Kärkkäinen, P. Sanders: Simple Linear Work Suffix Array Construction. ICALP'03, Lecture Notes in Computer Science, Vol. 2719, (2003)

28 Vielen Dank für die Aufmerksamkeit!


Herunterladen ppt "Konstruktion von Suffixarrays in linearer Zeit Vortrag im Seminar Mehr Algorithmische Bioinformatik von Marek Karadžić SS 2005 Leiter: Prof. Dr. Ulf Leser."

Ähnliche Präsentationen


Google-Anzeigen