970 likes | 1.11k Views
Referat zum Bau von Suffix Baeumen. Autoren: Hanna Kraeusel Axel Block Magnus Brockschmidt. Prozeduraler Algorithmus. Konstruiere T1; for (i=1; i<m; i++) {. /*Beginn von Phase i+1 */. Prozeduraler Algorithmus. Konstruiere T1; for (i=1; i<m; i++) { /*Beginn von Phase i+1 */
E N D
Referat zum Bau von Suffix Baeumen Autoren: Hanna Kraeusel Axel Block Magnus Brockschmidt
Prozeduraler Algorithmus Konstruiere T1; for (i=1; i<m; i++) { /*Beginn von Phase i+1 */
Prozeduraler Algorithmus Konstruiere T1; for (i=1; i<m; i++) { /*Beginn von Phase i+1 */ for (j=1; j<=j+1;j++) { /*Beginn von der j-ten Erweiterung*/
Prozeduraler Algorithmus Konstruiere T1; for (i=1; i<m; i++) { /*Beginn von Phase i+1 */ for (j=1; j<=i+1;j++) { /*Beginn von der j-ten Erweiterung*/ Finde das Ende des Pfades mit Label S[j..i]; Falls noetig, erweitere den Pfad durch S[i+1]; } }
Erweiterungsregeln • ß endet in einem Blatt. Dann füge [i+1]zum Kantenlabel hinzu.
Erweiterungsregeln • ß endet in einem Blatt. Dann füge [i+1]zum Kantenlabel hinzu. • Es gibt keinen Pfad am Ende von ß, der mit S[i+1] weitergeht, aber mindestens ein anderer Pfad geht weiter. Dann füge eine neue Kante mit Label S[i+1] ein. Dazu muß ein neuer Knoten erzeugt werden, wenn ß mitten in einer Kante endet. Gib dem neuen Blatt Nummer j.
Erweiterungsregeln • ß endet in einem Blatt. Dann füge [i+1]zum Kantenlabel hinzu. • Es gibt keinen Pfad am Ende von ß, der mit S[i+1] weitergeht, aber mindestens ein anderer Pfad geht weiter. Dann füge eine neue Kante mit Label S[i+1] ein. Dazu muß ein neuer Knoten erzeugt werden, wenn ß mitten in einer Kante endet. Gib dem neuen Blatt Nummer j. • Es gibt einen Pfad am Ende von ß, der mit S[i+1] weitergeht. In diesem Fall ist ßS[i+1] schon im Baum und wir tun nichts.
Beispiel: Wir wollen den Suffix Baum des Strings abcabcabacdba erzeugen. Um den Baum zu bilden, muss in der Phase i der Baum Bi in den BaumBi+1 umgewandelt werden. Wir beschreiben jede Phase und zeichnen den Baum immer, wenn die Phase beendet ist.
Einfügen von aGesamter String: a Es ist nur a Einzufügen! (Regel 2) a
Einfügen von bGesamter String: ab In der ersten Erweiterung fügen wir ein b an das vorhandene Blatt an. (Regel 1) a b
Einfügen von bGesamter String: ab In der ersten Erweiterung fügen wir ein b an das vorhandene Blatt an. (Regel 1) Die zweite Erweiterung konstruiert einen neuen Ast mit der Bezeichnung b. (Regel 2) a b b
Einfügen von bGesamter String: ab In der ersten Erweiterung fügen wir ein b an das vorhandene Blatt an. (Regel 1) Die zweite Erweiterung konstruiert einen neuen Ast mit der Bezeichnung b. (Regel 2) a b b Jetzt stehen alle Suffixe des Strings ab im Baum.
Einfügen von cGesamter String: abc In den ersten beiden Erweiterungen fügen wir ein c an die vorhandenen Blätter an. Die dritte Erweiterung konstruiert einen neuen Ast mit der Bezeichnung c. Jetzt sind alle Suffixe von abc im Baum enthalten. a b c b c c
Einfügen von aGesamter String: abca In den ersten drei Erweiterungen fügen wir ein a an die vorhandenen Blätter an. Die vierte Erweiterung muss keinen neuen Ast kreieren, da a bereits Als Präfix von abca vorhanden ist. (Regel 3) Jetzt sind alle Suffixe von abca im Baum enthalten. a b c b c a c a a
Einfügen von bGesamter String: abcab Diese Phase ist synchron zur vorherigen Phase. a b c b c a c a b a b b
Einfügen von cGesamter String: abcabc Auch hier ist nichts anderes zu tun. Man erkennt, dass der Suffix Baum keine weiteren Äste hinzufügt, wenn die neuen Character nur Teilstrings des gesamten Strings bilden. a b c b c a c a b a b c b c c
Einfügen von aGesamter String: abcabca Nur anhängen von a an die vorhandenen Äste nötig! a b c b c a c a b a b c b c a c a a
Einfügen von bGesamter String: abcabcab Jetzt wird noch b an die vorhandenen Äste angefügt! a b c b c a c a b a b c b c a c a b a b b
Einfügen von aGesamter String: abcabcaba a b c b c a c a b a b c b c a c a b a b a b a a Erweiterung 1 bis 3: Wie zuvor auch fuegen wir ein a an alle Aeste an.
Einfügen von aGesamter String: abcabcaba a b c b c a c a b a b c b c a c a a b a b a b a a Erweiterung 4: Jetzt muss der String abcaba gefunden werden. Von der Wurzel laufen wir abcab runter und fuegen ein a an.
Einfügen von aGesamter String: abcabcaba a b c b c a c a b a b c b c a c a a b a b a b a a Erweiterung 4: Jetzt muss der String abcaba gefunden werden. Von der Wurzel laufen wir abcab runter und fuegen ein a an.
Einfügen von aGesamter String: abcabcaba a b c b c a a c a a b a b c a b c a a c a a b a b a b a a
Einfügen von cGesamter String: abcabcabac a b c b c c a a c a a c b a c b c a b c a a c c a a c b a c b a b a c a c c
Einfügen von dGesamter String: abcabcabacd a b c d b c c a a d c a d a c b a c b d c a b d c a a c c a a c b d a c b d a b d a c a c d c d d
Einfügen von bGesamter String: abcabcabacdb a b c d b c c a a d b c a d a c b b a c b b d c a b d c a b a c c a b a c b d a c b d a b b d a b c a b c d c d b d b b
Einfügen von aGesamter String: abcabcabacdba a b c d b c c a a d b c a d a c b b a a c b b d c a a b d a c a b a c c a b a c a b d a c a b d a b b d a b c a a b c a d c a d b d b a b a a
Definition von Suffix Links • Knoten v hat die Beschriftung x (wobei x ein einzelner Character sei). ist möglicherweise leer.
Definition von Suffix Links • Knoten v hat die Beschriftung x (wobei x ein einzelner Character sei). ist möglicherweise leer. • Knoten s(v) hat die Beschriftung
Definition von Suffix Links • Knoten v hat die Beschriftung x (wobei x ein einzelner Character sei). ist möglicherweise leer. • Knoten s(v) hat die Beschriftung • Jetzt heißt die Kante v s(v) ein Suffix-Link.
Beobachtung Wenn der Knoten v als neuer innerer Knoten während der Verarbeitung von Erweiterung j in Phase i durch den bisherigen Algorithmus eingesetzt wird, und wenn v die Markierung x trägt, dann gilt eine der beiden Aussagen: • Der Weg mit Beschriftung endet in einem bereits vorhandenen inneren Knoten w = s(v). • Ein neuer Knoten s(v) wird bei der Verarbeitung von Extension j+1 in Phase i angelegt und s(v) hat als Beschriftung.
Beweis • Das Hinzufügen eines Knoten v kann nur in der Erweiterungsregel 2 passiert sein. • Dann gibt es, neben der Verbindung zum neuen Blatt, auch einen weiteren von v ausgehenden Weg, der den Buchstaben y als ersten besitzen möge.
Es treten zwei Fälle auf Fall1:Der gegenwärtige Baum besitzt neben xy einen weiteren Weg von der Wurzel beginnend mit der Beschriftung xz, wobei z ein beliebiger String aus dem Suffix sei, und z y. • Jetzt gibt es Suffixe mit den Präfixen xy und xz, also auch mit y und z. Deswegen besitzt der Baum einen Knoten s(v) mit der Beschriftung . • Fall2: Der gegenwärtige Baum besitzt keinen weiteren Weg wie in Fall1, dann wird in der Verarbeitung von S(j+1..i) ein neuer innerer Knoten s(v) angelegt, der die Beschriftung hat, weil es Suffixe mit den Präfixen y und S(i+1) gibt.
Lemma • Bei Ukkonens Algorithmus hat jeder implizite Suffix Baum für jeden neuen inneren Knoten einen Suffix Link nach dem Ende der nächsten Erweiterung.
Beweis • Der Beweis dieses Lemmas ist induktiv. • Sie ist wahr für B1, weil B1 noch keine Knoten besitzt. • Da in der letzten Erweiterung einer Phase keine neuen Knoten eingefügt werden, denn in dieser Phase ist der zu behandelnde String nur ein einzelner Character, sind am Ende der Phase i alle Knoten mit Suffix Links belegt und zu Beginn der Phase i+1 gilt ebenfalls die Aussage.
Single extension algorithm (SEA) Begin • Finde Knoten v über dem Ende von S[j-1..i]. Laufe eine Kante vom Ende von S[j-1..i] hoch. Sei nun y der String zwischen dem Ende von S[j-1..i] und v.
Single extension algorithm (SEA) Begin • Finde Knoten v über dem Ende von S[j-1..i]. Laufe eine Kante vom Ende von S[j-1..i] hoch. Sei nun y der String zwischen dem Ende von S[j-1..i] und v. • Wenn v nicht die Wurzel ist, gehe den Suffix Link entlang nach s(v). Klettere den Baum herunter an dem Ast des Strings y. Wenn v die Wurzel ist, folge S[j..i] von der Wurzel.
Single extension algorithm (SEA) Begin • Finde Knoten v über dem Ende von S[j-1..i]. Laufe eine Kante vom Ende von S[j-1..i] hoch. Sei nun y der String zwischen dem Ende von S[j-1..i] und v. • Wenn v nicht die Wurzel ist, gehe den Suffix Link entlang nach s(v). Klettere den Baum herunter an dem Ast des Strings y. Wenn v die Wurzel ist, folge S[j..i] von der Wurzel. • Sorge gemäss den Erweiterungsregeln dafür, dass der String S[j..i]S(i+1) im Baum enthalten ist.
Single extension algorithm (SEA) Begin • Finde Knoten v über dem Ende von S[j-1..i]. Laufe eine Kante vom Ende von S[j-1..i] hoch. Sei nun y der String zwischen dem Ende von S[j-1..i] und v. • Wenn v nicht die Wurzel ist, gehe den Suffix Link entlang nach s(v). Klettere den Baum herunter an dem Ast des Strings y. Wenn v die Wurzel ist, folge S[j..i] von der Wurzel. • Sorge gemäss den Erweiterungsregeln dafür, dass der String S[j..i]S(i+1) im Baum enthalten ist. • Wenn in Erweiterung j-1 ( nach Erweiterungsregel 2) ein Knoten w erzeugt wurde, dann muss der String das Ende des Suffix Links s(w) sein. Erzeuge einen Link (w,s(w)) von w nach s(w). End.
Beispiel: Wir wollen den Suffix Baum des Strings abcabcabacdb mit Hilfe von Suffixlinks erzeugen. Um den Baum zu bilden, muss in der Phase i der Baum Bi in den BaumBi+1 umgewandelt werden.
Einfügen von aGesamter String: a Es ist nur a Einzufügen! In den ersten Phasen sind die Suffix Links noch nicht wichtig, da noch keine Knoten vorhanden Sind. a
Einfügen von bGesamter String: ab In der ersten Erweiterung fügen wir ein b an das vorhandene Blatt an. a b
Einfügen von bGesamter String: ab In der ersten Erweiterung fügen wir ein b an das vorhandene Blatt an. Die zweite Erweiterung konstruiert einen neuen Ast mit der Bezeichnung b. a b b
Einfügen von bGesamter String: ab In der ersten Erweiterung fügen wir ein b an das vorhandene Blatt an. Die zweite Erweiterung konstruiert einen neuen Ast mit der Bezeichnung b. a b b Jetzt stehen alle Suffixe des Strings ab im Baum.
Einfügen von cGesamter String: abc In den ersten beiden Erweiterungen fügen wir ein c an die vorhandenen Blätter an. Die dritte Erweiterung konstruiert einen neuen Ast mit der Bezeichnung c. Jetzt sind alle Suffixe von abc im Baum enthalten. a b c b c c
Einfügen von aGesamter String: abca In den ersten drei Erweiterungen fügen wir ein a an die vorhandenen Blätter an. Die vierte Erweiterung muss keinen neuen Ast kreieren, da a bereits Als Präfix von abca vorhanden ist. Jetzt sind alle Suffixe von abca im Baum enthalten. a b c b c a c a a
Einfügen von bGesamter String: abcab Diese Phase ist synchron zur vorherigen Phase. a b c b c a c a b a b b
Einfügen von cGesamter String: abcabc Auch hier ist nichts anderes zu tun. Man erkennt, dass der Suffix Baum keine weiteren Äste hinzufügt, wenn die neuen Character nur Teilstrings des gesamten Strings bilden. a b c b c a c a b a b c b c c
Einfügen von aGesamter String: abcabca Nur anhängen von a an die vorhandenen Äste nötig! a b c b c a c a b a b c b c a c a a
Einfügen von bGesamter String: abcabcab Jetzt wird noch b an die vorhandenen Äste angefügt! a b c b c a c a b a b c b c a c a b a b b