Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Referat zum Bau von Suffix Baeumen Autoren: Hanna Kraeusel Axel Block Magnus Brockschmidt.

Ähnliche Präsentationen


Präsentation zum Thema: "Referat zum Bau von Suffix Baeumen Autoren: Hanna Kraeusel Axel Block Magnus Brockschmidt."—  Präsentation transkript:

1 Referat zum Bau von Suffix Baeumen Autoren: Hanna Kraeusel Axel Block Magnus Brockschmidt

2 Prozeduraler Algorithmus Konstruiere T1; for (i=1; i

3 Prozeduraler Algorithmus Konstruiere T1; for (i=1; i

4 Prozeduraler Algorithmus Konstruiere T1; for (i=1; i

5 Erweiterungsregeln 1.ß endet in einem Blatt. Dann füge [i+1] zum Kantenlabel hinzu.

6 Erweiterungsregeln 1.ß endet in einem Blatt. Dann füge [i+1] zum Kantenlabel hinzu. 2.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.

7 Erweiterungsregeln 1.ß endet in einem Blatt. Dann füge [i+1] zum Kantenlabel hinzu. 2.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. 3.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.

8 Beispiel: Wir wollen den Suffix Baum des Strings abcabcabacdba erzeugen. Um den Baum zu bilden, muss in der Phase i der Baum B i in den Baum B i+1 umgewandelt werden. Wir beschreiben jede Phase und zeichnen den Baum immer, wenn die Phase beendet ist.

9 Einfügen von a Gesamter String: a a Es ist nur a Einzufügen! (Regel 2)

10 Einfügen von b Gesamter String: ab abab In der ersten Erweiterung fügen wir ein b an das vorhandene Blatt an. (Regel 1)

11 Einfügen von b Gesamter String: ab abbabb 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)

12 Einfügen von b Gesamter String: ab abbabb 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) Jetzt stehen alle Suffixe des Strings ab im Baum.

13 Einfügen von c Gesamter String: abc abcbccabcbcc 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.

14 Einfügen von a Gesamter String: abca abcbcacaaabcbcacaa 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.

15 Einfügen von b Gesamter String: abcab abcbcacababbabcbcacababb Diese Phase ist synchron zur vorherigen Phase.

16 Einfügen von c Gesamter String: abcabc abcbcacababcbccabcbcacababcbcc 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.

17 Einfügen von a Gesamter String: abcabca abcbcacababcbcacaaabcbcacababcbcacaa Nur anhängen von a an die vorhandenen Äste nötig!

18 Einfügen von b Gesamter String: abcabcab abcbcacababcbcacababbabcbcacababcbcacababb Jetzt wird noch b an die vorhandenen Äste angefügt!

19 Einfügen von a Gesamter String: abcabcaba abcbcacababcbcacabababaaabcbcacababcbcacabababaa Erweiterung 1 bis 3: Wie zuvor auch fuegen wir ein a an alle Aeste an.

20 Einfügen von a Gesamter String: abcabcaba abcbcacababcbcacaabababaaabcbcacababcbcacaabababaa Erweiterung 4: Jetzt muss der String abcaba gefunden werden. Von der Wurzel laufen wir abcab runter und fuegen ein a an.

21 Einfügen von a Gesamter String: abcabcaba abcbcacababcbcacaabababaaabcbcacababcbcacaabababaa Erweiterung 4: Jetzt muss der String abcaba gefunden werden. Von der Wurzel laufen wir abcab runter und fuegen ein a an.

22 Einfügen von a Gesamter String: abcabcaba abcbcaacaababcabcaacaabababaaabcbcaacaababcabcaacaabababaa

23 Einfügen von c Gesamter String: abcabcabac abc b ccaa ca acb acbca bcaac caacb acba bac ac c

24 Einfügen von d Gesamter String: abcabcabacd abc d b ccaad ca dacb acbdca bdcaac caacbd acbda bdac acd cd d

25 Einfügen von b Gesamter String: abcabcabacdb abc d b ccaad b ca dacbb ac bbdca bdcabac cabacbd acbdab bdabc abcd cdb db b

26 Einfügen von a Gesamter String: abcabcabacdba abc d b ccaad b ca dacbb a ac bbdcaa bd acabac cabacabd acabdab bdabca abcad cadb dba ba a

27 Definition von Suffix Links Knoten v hat die Beschriftung x (wobei x ein einzelner Character sei). ist möglicherweise leer.

28 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

29 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.

30 Gibt es für jeden Knoten v ein Suffix Link zu s(v)?

31 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: 1. Der Weg mit Beschriftung endet in einem bereits vorhandenen inneren Knoten w = s(v). 2. Ein neuer Knoten s(v) wird bei der Verarbeitung von Extension j+1 in Phase i angelegt und s(v) hat als Beschriftung.

32 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.

33 Es treten zwei Fälle auf Fall1: Der gegenwärtige Baum besitzt neben x y einen weiteren Weg von der Wurzel beginnend mit der Beschriftung x z, wobei z ein beliebiger String aus dem Suffix sei, und z y. Jetzt gibt es Suffixe mit den Präfixen x y und x z, 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.

34 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.

35 Beweis Der Beweis dieses Lemmas ist induktiv. Sie ist wahr für B 1, weil B 1 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.

36 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.

37 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.

38 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.

39 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.

40 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 B i in den Baum B i+1 umgewandelt werden.

41 Einfügen von a Gesamter String: a a Es ist nur a Einzufügen! In den ersten Phasen sind die Suffix Links noch nicht wichtig, da noch keine Knoten vorhanden Sind.

42 Einfügen von b Gesamter String: ab abab In der ersten Erweiterung fügen wir ein b an das vorhandene Blatt an.

43 Einfügen von b Gesamter String: ab abbabb 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.

44 Einfügen von b Gesamter String: ab abbabb 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. Jetzt stehen alle Suffixe des Strings ab im Baum.

45 Einfügen von c Gesamter String: abc abcbccabcbcc 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.

46 Einfügen von a Gesamter String: abca abcbcacaaabcbcacaa 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.

47 Einfügen von b Gesamter String: abcab abcbcacababbabcbcacababb Diese Phase ist synchron zur vorherigen Phase.

48 Einfügen von c Gesamter String: abcabc abcbcacababcbccabcbcacababcbcc 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.

49 Einfügen von a Gesamter String: abcabca abcbcacababcbcacaaabcbcacababcbcacaa Nur anhängen von a an die vorhandenen Äste nötig!

50 Einfügen von b Gesamter String: abcabcab abcbcacababcbcacababbabcbcacababcbcacababb Jetzt wird noch b an die vorhandenen Äste angefügt!

51 Einfügen von a Gesamter String: abcabcaba abcbcacababcbcacabababaaabcbcacababcbcacabababaa Erweiterung 1 bis 3: Wie zuvor auch fuegen wir ein a an alle Aeste an. In dieser Phase kommen die Suffix Links erst richtig ins Spiel.

52 Einfügen von a Gesamter String: abcabcaba abcbcacababcbcacaabababaaabcbcacababcbcacaabababaa Erweiterung 4: Jetzt muss der String abcaba eingefuegt werden. Von der Wurzel laufen wir abcab runter und fuegen ein a an. Diese Erweiterung erzeugt einen Knoten, der noch keinen Suffix Link hat, aber wir wissen, dass dieser in der naechsten Erweiterung hinzugefuegt wird.

53 Einfügen von a Gesamter String: abcabcaba abcbcacababcbcaacaabababaaabcbcacababcbcaacaabababaa Erweiterung 5: Jetzt muss der String bcaba eingefuegt werden. Von der Wurzel laufen wir bcab runter und fuegen ein a an. Diese Erweiterung erzeugt einen Suffix Link. Der neue Knoten ist allerdings noch nicht weiterverlinkt, was wieder in der naechsten Erweiterung passieren wird.

54 Einfügen von a Gesamter String: abcabcaba abcbcacababcabcaacaabababaaabcbcacababcabcaacaabababaa Erweiterung 6: Jetzt muss der String caba eingefuegt werden. Von der Wurzel laufen wir cab runter und fuegen ein a an. Diese Erweiterung erzeugt wie zuvor einen Suffix Link.

55 Einfügen von a Gesamter String: abcabcaba abcbcacaababcabcaacaabababaaabcbcacaababcabcaacaabababaa Erweiterung 7: Jetzt muss der String aba eingefuegt werden. Von der Wurzel laufen wir ab runter und fuegen ein a an. Diese Erweiterung erzeugt wie zuvor einen Suffix Link.

56 Einfügen von a Gesamter String: abcabcaba abcbcaacaababcabcaacaabababaaabcbcaacaababcabcaacaabababaa Erweiterung 8: Jetzt muss der String ba eingefuegt werden. Von der Wurzel laufen wir b runter und fuegen ein a an. Diese Erweiterung erzeugt wie zuvor einen Suffix Link. Der Suffix Link des neuen Knotens fuehrt zur Wurzel, da b nur noch ein einzelner Character ist und α ist in diesem Fall ein leerer String.

57 Einfügen von a Gesamter String: abcabcaba abcbcaacaababcabcaacaabababaaabcbcaacaababcabcaacaabababaa Erweiterung 9: Jetzt muss lediglich noch der Character a eingefuegt werden. Dieser ist allerdings schon vorhanden.

58 Einfügen von a Gesamter String: abcabcaba abcbcaacaababcabcaacaabababaaabcbcaacaababcabcaacaabababaa Unser Baum ist jetzt vollstaendig verlinkt und die Phase ist beendet.

59 Einfügen von c Gesamter String: abcabcabac abcbcaacaababcabcaacaabababaacabcbcaacaababcabcaacaabababaac Erweiterung 1: Die erste Erweiterung ist immer speziell. Wir muessen den String abcabcabac einfuegen. Wir wissen, dass abcabcaba der laengste String im Baum ist. Wir laufen diesen runter und fuegen dort ein c an.

60 Einfügen von c Gesamter String: abcabcabac abcbcaacaababcabcaacaabababaaccabcbcaacaababcabcaacaabababaacc Erweiterung 2:Wir muessen den String bcabcabac einfuegen. Wir nutzen den Suffix Link. Wir wissen, dass der erste Knoten ueber dem laengsten String im Baum ein Suffix link hat. Wir laufen vom laengsten Blatt hoch bis zum besagten Suffix Link. Von da gehen wir die gleiche Bezeichnug wieder runter und fuegen dort ein c an.

61 Einfügen von c Gesamter String: abcabcabac abcbcaacaababcabcaacaabababacaccabcbcaacaababcabcaacaabababacacc Erweiterung 3:Wir muessen den String cabcabac einfuegen. Wir nutzen wieder den Suffix Link. Wir laufen von der Position, wo wir in Erweiterung 2 das c eingefuegt haben, hoch bis zu dem Suffix link. Von da gehen wir die gleiche Bezeichnug wieder runter, die wir hochgegangen sind, und fuegen dort ein c an.

62 Einfügen von c Gesamter String: abcabcabac abcbcaacaababcabcaacaabacbabacaccabcbcaacaababcabcaacaabacbabacacc Erweiterung 4:Wir muessen den String abcabac einfuegen. Wir nutzen den zustaendigen Suffix Link. Wir laufen von der Position, wo wir in Erweiterung 3 das c eingefuegt haben, hoch bis zu dem Suffix link. Von da gehen wir die gleiche Bezeichnug wieder runter, die wir hochgegangen sind, und fuegen dort ein c an.

63 Einfügen von c Gesamter String: abcabcabac abcbcaacaababcabcaacaacbacbabacaccabcbcaacaababcabcaacaacbacbabacacc Erweiterung 5: Wir muessen den String bcabac einfuegen. Jetzt nehmen wir den ersten Suffix Link. Wir laufen von der Position, wo wir in Erweiterung 4 das c eingefuegt haben, hoch bis zu dem ersten Suffix link. Von da gehen wir das a runter, daswir auch hochgegangen sind, und fuegen dort ein c an.

64 Einfügen von c Gesamter String: abcabcabac abcbcaacaababcabcaaccaacbacbabacaccabcbcaacaababcabcaaccaacbacbabacacc Erweiterung 6: Wir muessen den String cabac einfuegen. Dies passiert wie in Erweiterung 5. Wir laufen von der Position, wo wir in Erweiterung 5 das c eingefuegt haben, hoch bis zu dem ersten Suffix link. Von da gehen wir das a runter, daswir auch hochgegangen sind, und fuegen dort ein c an.

65 Einfügen von c Gesamter String: abcabcabac abcbcaacaacbacbcabcaaccaacbacbabacaccabcbcaacaacbacbcabcaaccaacbacbabacacc Erweiterung 7 und 8: Wir muessen den String abac und bac einfuegen. Diese Vorgaenge sind ebenfalls wie in Erweiterung 5. Wir laufen von der Position, wo wir in der vorherigen Erweiterung das c eingefuegt haben, hoch bis zu dem ersten Suffix link. Von da gehen wir das a runter, das wir auch hochgegangen sind, und fuegen dort ein c an.

66 Einfügen von c Gesamter String: abcabcabac abc b ccaa caacb acbca bcaac caacb acba bac ac c Erweiterung 9: Wir muessen den String ac einfuegen. Wir laufen von der Position, wo wir in der vorherigen Erweiterung das c eingefuegt haben, hoch bis zu dem ersten Suffix link, hier die Wurzel. Von da gehen wir das a runter, das wir auch hochgegangen sind, und fuegen dort einen neuen Ast fuer das c an. Es entsteht ein neuer Suffix Link zur Wurzel.

67 Einfügen von c Gesamter String: abcabcabac abc b ccaa caacb acbca bcaac caacb acba bac ac c Erweiterung 10: Wir muessen den String c einfuegen. Dieser existiert allerdings bereits als Praefix im Baum.

68 Einfügen von c Gesamter String: abcabcabac abc b ccaa caacb acbca bcaac caacb acba bac ac c Phase ist beendet und der Baum ist vollstaendig verlinket.

69 Einfügen von d Gesamter String: abcabcabacd abc b ccaa caacb acbca bcaac caacb acba bac ac c d Erweiterung 1: abcabcabacd muss eingefuegt werden. Es geht ebenso wie in der Phase zuvor! Der gesuchte String ist der Laengste. Wir fuegen d ein und merken uns die Position.

70 Einfügen von d Gesamter String: abcabcabacd abc b ccaa caacb acbca bcaac caacb acba bac ac cd d Erweiterung 2: bcabcabacd muss eingefuegt werden. Es geht ebenso wie in der Phase zuvor! Von der gemerkten Position gehen wir bis zum Suffix Link hoch, diesen entlang und an der Stelle die gleiche Bezeichnung wieder herunter!

71 Einfügen von d Gesamter String: abcabcabacd abc b ccaa caacb acbca bcaac c aacb a cbda b dac acd cd d Erweiterung 3-5: cabcabacd, abcabacd, bcabacd mussen eingefuegt werden. Von der gemerkten Position gehen wir jeweils bis zum Suffix Link hoch, diesen entlang und an der Stelle die gleiche Bezeichnung wieder herunter! Wir nutzen fuer diese drei Schritte die markierten Links und fuegen die gelben ds ein.

72 Einfügen von d Gesamter String: abcabcabacd abc b ccaa ca dacb acbdca bdcaac c aacbd a cbda b dac acd cd d Erweiterung 6-9: cabacd, abacd, bacd, acd mussen eingefuegt werden. Von der gemerkten Position gehen wir jeweils bis zum Suffix Link hoch, diesen entlang und an der Stelle die gleiche Bezeichnung wieder herunter! Wir nutzen fuer diese drei Schritte die markierten Links und fuegen die gelben ds ein.

73 Einfügen von d Gesamter String: abcabcabacd abc b ccaad ca dacb acbdca bdcaac c aacbd a cbda b dac acd cd d Erweiterung 9: cd muss eingefuegt werden. Jetzt gehen wir ueber den Suffixlink zur Wurzel, laufen ein c wieder runter, weil wir das auch hochgelaufen sind, und fuegen einen neuen Ast fuer das d ein. Es entsteht ein neuer Suffix Link zur Wurzel.

74 Einfügen von d Gesamter String: abcabcabacd abcd b ccaad ca dacb acbdca bdcaac c aacbd a cbda b dac acd cd d Erweiterung 11:d muss eingefuegt werden. Jetzt gehen wir ueber Den neuen Suffixlink zur Wurzel, laufen ein c wieder runter, weil wir das auch hochgelaufen sind, und fuegen einen neuen Ast fuer das d ein.

75 Einfügen von d Gesamter String: abcabcabacd abcd b ccaad ca dacb acbdca bdcaac c aacbd a cbda b dac acd cd d Die Phase ist beendet und der Baum vollstaendig verlinkt.

76 Einfügen von b Gesamter String: abcabcabacdb abcd b ccaadb ca dacbb ac bbdca bdcabac c abacbd a cbdab b dabc a bcd cdb db b Nach der letzten Phase erhalten wir diesen Baum.

77 Trick Nr. 1 Skip/Count Trick Wir befinden uns an einem Knoten v, und das nun zu erweiternde Suffix hat ein Praefix, welches auf abcdefgh endet. Sinn: In Phase zwei vom Knoten s(v) dem Label y folgen erfordert eine Zeit t ~ Laenge von y |y|. Der Skip/Count Trick reduziert t auf t ~ Anzahl der Knoten in y.

78 Trick 1 Der Trick ist sehr simpel: Wenn am Knoten s(v) angekommen, suche den Weg aus dem Knoten, welcher mit dem Anfangsbuchstaben von y beginnt. Wenn y länger ist als der String an dieser Kante bis zum nächsten Knoten, so springe zum nächsten Knoten. Setze einen Index auf den |String| + 1. Nun schaue, welche Kante aus diesem Knoten mit dem |String| + 1 Buchstaben aus y beginnt und springe zum nächsten Knoten usw. Dieses "Springen" endet, wenn der String an der folgenden Kante länger oder gleich der Länge von y ist. Dann ist nämlich das Ende von y erreicht und nun wird die entsprechende Extension Rule angewendet. Also: Man guckt einfach nach dem Weg, zählt und springt einen Knoten weiter oder zum Ende. Aber was ist mit dem Worst Case?

79 Suffix Link abcdabcd e f g h i j vS(v) String y Dem Suffix Link von v nach s(v) folgen, dann soll es den String y = abcdefgh heruntergehen, um an dessen Ende ein Zeichen anzuhaengen. Der naïve Algorithmus wuerde Zeichen fuer Zeichen ablaufen. G ist hier die Laenge des restlichen abzulaufenden Teils von y, I der Index des naechsten Zeichens. G = |y| = 8, I = 1,

80 Suffix Link abcdabcd e f g h i j vS(v) String y Wir suchen den Buchstaben an diesem Knoten, mit dem y beginnt, also a, gucken, ob an dieser Kante mehr Buchstaben stehen als y lang ist, hier abcd, also kuerzer, somit springen wir zum naechsten Knoten. Wenn y kuerzer ist als der String an dieser Kante, waere das Ende von y erreicht, und wir koennten anfuegen. Nun springen wir direkt zu diesem Knoten x z g G = |y| = 8, I = 1, Aktuelle Position

81 Suffix Link abcdabcd e f g h i j vS(v) String y Nun sind wir an dem Knoten. Wir haben 4 Zeichen uebersprungen, also wird G auf G-4 gesetzt und I auf 1+4. Dann gehts weiter, nach der Kante mit dem 5ten Zeichen von y suchen und zum naechsten Knoten springen. Nun springen wir weiter zu diesem Knoten x z g G = G-4 = 4, I = I+4 = 5, Aktuelle Position

82 Suffix Link abcdabcd e f g h i j vS(v) String y Die Laenge des Strings an der naechsten Kante, die mit dem 7ten Zeichen von y beginnt ist groesser als die Laenge des Restes von y. Das Ende von y liegt also an dieser Kante. Aktuelle Position. x z g G = G-2 = 2, I = I+2 = 7 Ende von y

83 Suffix Link abcdabcd e f g h i j vS(v) String y Wir haben nun das Ende von y gefunden und koennen das Zeichen, z.B. ein w einfuegen. Hier findet sich das Ende von y, und das Zeichen kann eingefuegt werden. x z g

84 Suffix Link abcdabcd e f g h i j vS(v) String y W eingefuegt, es geht weiter mit der naechsten Extension. Hier findet sich nun ein neuer Knoten und ein Ast mit Label w. x z g w

85 Definition Die Tiefe (Knotentiefe) eines Knotens ist die Anzahl der Knoten auf dem Pfad von der Wurzel bis zu diesem Knoten.

86 Lemma Es sei (v, s(v)) irgendein Suffix Link. Dann ist die Knotentiefe von v hoechstens um 1 groesser als die von s(v).

87 Beweis Jeder interne Vorfahr von v mit Label xbeta hat einen Link zu einem Knoten mit Label beta. xbeta ist ein Präfix des Pfades zu v, so ist beta ein Präfix des Pfades zu s(v) --> Jeder Link von einem internen Vorfahr von v geht zu einem internen Vorfahr von s(v). Und wenn beta nicht leer ist, so ist der Knoten mit dem Label beta ein interner Knoten. Da die Tiefen zweier Vorfahren von v verschieden sein muessen, hat jeder Vorfahr von v einen Link zu einem anderen Vorfahren von s(v). -->Die Tiefe von s(v) ist mindestens 1 (Wurzel) + die Anzahl interner Vorfahren von v mit längerer Bezeichnung als einem Zeichen. Den einzigen Vorfahren ohne Gegenstück, den v haben kann, ist der mit nur einem Zeichen, und nur dann ist die Tiefe von v auch nur 1 groesser als die von s(v).

88 D A C F A L B A L D A C T A L D A C F A L B N ALAL C F A L B A L D A C T A L D A C F A L B N L D A C F A L B A L D A C T A L D A C F A L B N N N N N Ausschnitt aus dem Suffixbaum fuer den String ALDACFALBALDACTALDACFALBN, ohne Links.

89 D A C F A L B A L D A C T A L D A C F A L B N ALAL C F A L B A L D A C T A L D A C F A L B N L D A C F A L B A L D A C T A L D A C F A L B N N N N N Bei diesen Links ist die Tiefe von v um 1 groesser als die Tiefe von s(v). v vv S(v)

90 D A C F A L B A L D A C T A L D A C F A L B N ALAL C F A L B A L D A C T A L D A C F A L B N L D A C F A L B A L D A C T A L D A C F A L B N N N N N Bei diesen Links ist die Tiefe von v um 1 kleiner als die Tiefe von s(v). vv S(v)

91 Definition Die aktuelle Knotentiefe ist die des zuletzt besuchten Knotens.

92 Behauptung Mit diesem Trick dauert jede Phase des Algorithmus O(m).

93 Beweis Es gibt höchstens m Extensions in einer Phase. In einer davon es geht höchstens einen Knoten hoch zum nächsten Link, den Link entlang, die Knoten herunter und die Regeln ausführen, evtl auch Link setzen. Wir wissen, daß alles ausser dem Knoten abwärts gehen konstante Zeit benoetigt. Dieses untersuchen wir anhand der Tiefeveränderung in einer Phase. Einen hoch, der Suffix Link erhöht höchstens weiter um einen, es geht also höchstens zwei rauf, also insgesamt höchstens 2m rauf. Da der Baum aber höchstens m Knoten haben kann, geht es auf die Phase gesehen höchstens 3m herunter. Es gibt also höchstens 3m downwalks, --> O(m)

94 Corollar Es gibt m Phasen mit O(m), also insgesamt O(m*m). Das ist sehr grob gerechnet und sieht schlecht aus, aber mit ein paar kleinen weiteren Details erreichen wir O(m).

95 Ersetzen der Zeichen durch Indices Durch die Zeichen an den Kanten nimmt der Baum sehr viel Platz weg. Diese werden nun durch Indices ersetzt, die Anfang und Ende des Teilstrings im Gesamtstring markieren.

96 Der Auschnitt aus dem Baum, dieses mal mit Indices. A L D A C F A L B A L D A C T A L D A C F A L B N

97 Single Phase Algorithm (SPA) 1.Setze e auf i+1. 2.Führe mit Hilfe vonSuffix-Links Erweiterungen durch, bis in Erweiterung j* Regel 3 angewandt wird. 3.Setze j i+1 auf j*-1 und gehe zur nächsten Phase.


Herunterladen ppt "Referat zum Bau von Suffix Baeumen Autoren: Hanna Kraeusel Axel Block Magnus Brockschmidt."

Ähnliche Präsentationen


Google-Anzeigen