.9.7 Konstruktion der Suffixbäume Beipiel: xabxa (siehe Abbildung.27) Man beginnt mit der Konstruktion eines Suffixbaumes für gesamten String und schreibt eine 1 am Blatt, weil der Suffix xabxa an der Stelle 1 des Strings beginnt. So geht man Zeichen für Zeichen den String durch. Kommt jedoch ein Suffix vor, dessen Anfangssymbol(e) bereits im Suffixbaum vorkommt, so zerlegt man die bereits existierende Kante in zwei Kanten (Wörter) genau an der Stelle, wo die Gleichheit zwischen bereits existierendem und neu einzufügundem Suffix aufhört. xabxa xabxa xabxa abxa xabxa abxa xabxa abxa bxa xabxa abxa bxa 1 1 2 xabxa abxa bxa xa xa bxa abxa bxa abxa bxa xa bxa xabxa abxa bxa xa a a bxa bxa xa a bxa bxa a bxa xa bxa 5 5 xabxa abxa bxa xa a bxa xa bxa a bxa 5 6 xabxa abxa bxa xa a $ bxa a bxa xa bxa 5 $ 6 7 Abbildung.27: Konstruktion des Suffixbaumes am Beispiel von xabxa 109
Naiver Algorithmus zu Konstruktion von Suffixbäumen. Konstruiere Folge T 1, T 2,..., T n von Bäumen, wobei T i alle Suffizies S[1..n], S[2..n],..., S[i..n] enthält. D.h., der Baum T 1 hat nur eine Kante und enthält nur einen Suffix S[1..n] = S (Abbildung.28), T 2 enthält Suffizies S[1..n], S[2..n] usw. T 1 : 1 Abbildung.28: Erster Schritt bei der Aufbau eines zunächst leeren Suffixbaumes T i+1 wird aus T i wie folgt konstruiert: 1: Durchlaufe T i mit dem Suffix S i+1 (= S[i + 1..n]) wie beim Matching Algorithmus bis man "stecken bleibt". Also (Abbildung.29): S i+1 = αβ, wobei α ist ein maximaler Präfix, der als Markierung eines Knotens u (d.h. Beschriftung des Weges von Wurzel bis u) plus Präfix α, der Markirung γ einer von u ausgehender Kante e = (u, v) auftritt. 2: Wir schaffen ein neues Blatt w mit dem Index i + 1 3: Falls α = ε (leeres Wort) (Abbildung.30): schaffe eine neue Kante e = (u, v) und beschrifte sie mit β Sonst (Abbildung.31): sei γ = α β, wobei α ε, δ ε schaffe neuen Knoten x spalte Kante e in e 1 = (u, x) und e 2 = (x, v) schaffe neue Kante e = (x, w) beschrifte e 1 mit α, e 2 mit δ, e mit β Wurzel α α' γ u α' γ v Abbildung.29: α ist Präfix eines existierenden Suffixes im Baum 110
Wurzel α α'=ε (leeres Wort) u w β i+1 γ v Abbildung.30: α = ε (Leeres Wort) Wurzel α γ=α'δ, α' ε, δ ε u γ α' w i+1 β x v δ Abbildung.31: γ = α δ, wobei α ε, δ ε 111
Laufzeit Für jeden Suffix S i ( S i = n i+1) wird eine Suche durchgeführt, die O(n i+1)- Zeit kostet. Schritte ( 2 und 3 benötigen konstante Zeit, also O(1). n ) Insgesamt : O n i + 1 = O ( n 2) i=1 }{{} P n n(n+1) j=1 j= 2 n2 2 Speicherbedarf Die Größe des entstehenden Baumes (Speicherbedarf), einschließlich der Beschriftungen der Kanten ist O(n 2 ). Best case ist nur dann zu erwarten wenn alle Zeichen gleich sind (S = a n ), so liegt der Speicherbedarf bei O(n) und der Baum sieht wie auf der Abbildung.32 aus: Abbildung.32: Suffixbaum mit dem Speicherbedarf O(n) Sonst aber kommt es an Θ(n 2 ) heran, was für große Texte (Buch, DNA-Analyze) nicht akzeptabel ist. In der Praxis wird eine andere Konstruktion/Modifikation des Suffixbaumes verwendet, die in linearer Zeit konstruiert werden kann und linearer Speicherplatz benötigt. Dabei handelt es sich um das Algortihmus von Ukkonen (AU). Wir werden den Algorithmus nicht näher betrachten, da er sehr kompliziert ist..9.8 Anwendungen von Suffixbäumen 1 Stringmatching Konstuktion des Suffixbaumes mit AU mit anschließender Suche nach P liefert alternativen O(n + m)-algorithmus. 1a Finden einer Menge von Strings {P 1,.., P l } in einem Text S Zu finden sind alle Vorkommen von Mustern im Text S. Das ist machbar in Vorverarbeitungszeit O(n) mit AU. Laufzeit für eigentliche Suche beträgt O(m + k), wobei m = k i=1 P i, k ist Anzahl aller Vorkommen. 2 Datenbank von Texten S 1,..., S l Zu finden sind alle Vorkommen eines Musters P in Texten S 1,..., S l. 112
Dafür werden die Texte zusammengestellt getrennt durch spezielle Trennzeichen $ i die weder im Text noch im Muster vorkommen: S 1 $ 1 S 2 $ 2..$ l 1 S l. Ohne dieser Trennzeichen wäre es möglich ein Muster so zu finden, dass sein Präfix in S j und sein Suffix in S j+1 liegt. Dafür bauen wir einen Suffixbaum auf. Vorverarbeitungszeit beträgt O(n), n = l i=1 S l, Suchzeit ist O(m + k), wobei m = P und k ist Anzahl aller Vorkommen. 3 Suche nach dem längsten gemeinsamen Teilwort Gegeben sind Strings S 1 und S 2. Zu finden ist das längste gemeinsame Teilwort. Idee: - konstruiere einen Suffixbaum wie in o.a. Anwendung 2. für S 1 und S 2 - markiere jeden inneren Knoten v mit 1, falls sein Unterbaum einen Suffix von S 1 enthält und mit 2 falls einen Suffix von S 2. D. h. in v endet sich ein Teilwort von S 1 (oder S 2 ) - finde tiefsten Knoten, der mit 1 und 2 markiert ist, wobei die Tiefe = Länge der Beschriftungen von der Wurzel bis dorthin. Mit AU lässt sich das Problem in O ( S 1 + S 2 ) Zeit lösen. Ungestritten gibt es viele weitere Anwendungen. Einige der wichtigen davon finden sich in der Bioinformatik..9.9 Anwendungen in der Bioinformatik Definition.9.2 (DNA-Moleküle (deutsch: DNS - Desoxyribonukleinsäure)). Moleküle, die die Erbinformation eines Organismus enthalten und sind Doppelketten aus folgenden Bausteinen (Molekülen) {A, T, C, G} (Adenin, Thymin, Cytosin, Guanim). Einzelne Bausteine heißen Nukleotide. Ein Molekül besteht aus 10 9 10 10 Nukleotiden. Dabei gibt es zwei Zuordnungen: A T und C G. Definition.9.3 (Genom). Gesamtkette der DNA-Moleküle, die gesamte Erbinformation enthält (mehr dazu kann man z.b. bei http://de.wikipedia. org/wiki/genom nachlesen). Definition.9. (Protein). Ein String über einem 20-elementigen Alphabet (die Zeichen des Alphabets sind die Aminosäuren). Die Länge eines solchen Strings kann mehrere Hunderte sein. (z.b.: bei Bakterien: 500-1500, bei Menschen (Säugetieren) 100.000). Definition.9.5 (Genetischer Code). Codierung eines Aminosäurenbausteins im Protein durch jeweils ein Tripel von aufeinanderfolgenden Nukleotiden. Beispiel (Genetischer Code). TTT - Phenylamin, GTT - Valin Da es um die Tripeln handelt, ist es wichtig bei der Decodierung eines DNA- Abschnittes an der richtigen Stelle anzufangen (man weiß nicht genau, am Anfang des DNA-Stücks der Tripel sauber oder innendrin getrennt wurde). Definition.9.6 (Sequenzierung). Bestimmung der Folge von Nukleotiden eines DNA-Moleküls. 113
Den ganzen Genom erhält man durch das Überlappen einzelner Stücke (Abbildung.33). Bisher (Stand: 200) ist es technisch möglich Stücke der Länge 300-500 zu identifizieren. Dabei soll man bedenken in welche Richtung die Einzelstücke bei dem Überlappen gerichtet werden sollen. Abbildung.33: Rekonstruktion eines Genoms durch das Überlappen der DNA- Fragmente Es gibt also folgendes Problem (theoretisch) zu lösen: gegeben sind viele Teilworte, gesucht ist das kleinste gemeinsame Oberwort. Dieses Problem ist NP-schwer und ist ein gutes Beipiel für die o.a. Anwendung 1.a (Finden einer Menge von Mustern in einem Text).9.8. Dabei ist der Text ein bereits sequinziertes DNA-Stück. Jedes neue Fragment wird gegen den Text getestet, ob nicht bereits vorhanden. Ist es nicht der Fall, so sucht man nach einer Überlappung mit dem Ende des Textes. 11