Referat zum Bau von Suffix Baeumen - PowerPoint PPT Presentation

About This Presentation
Title:

Referat zum Bau von Suffix Baeumen

Description:

Referat zum Bau von Suffix Baeumen Autoren: Hanna Kraeusel Axel Block Magnus Brockschmidt – PowerPoint PPT presentation

Number of Views:85
Avg rating:3.0/5.0
Slides: 98
Provided by: hkr3
Category:
Tags: baeumen | bau | naive | referat | string | suffix | von | zum

less

Transcript and Presenter's Notes

Title: Referat zum Bau von Suffix Baeumen


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

2
Prozeduraler Algorithmus
  • Konstruiere T1
  • for (i1 iltm i)

/Beginn von Phase i1 /
3
Prozeduraler Algorithmus
  • Konstruiere T1
  • for (i1 iltm i)
  • /Beginn von Phase i1 /
  • for (j1 jltj1j)
  • /Beginn von der j-ten Erweiterung/

4
Prozeduraler Algorithmus
  • Konstruiere T1
  • for (i1 iltm i)
  • /Beginn von Phase i1 /
  • for (j1 jlti1j)
  • /Beginn von der j-ten Erweiterung/
  • Finde das Ende des Pfades mit Label Sj..i
  • Falls noetig, erweitere den Pfad durch
    Si1

5
Erweiterungsregeln
  1. ß endet in einem Blatt. Dann füge i1 zum
    Kantenlabel hinzu.

6
Erweiterungsregeln
  • ß endet in einem Blatt. Dann füge i1 zum
    Kantenlabel hinzu.
  • Es gibt keinen Pfad am Ende von ß, der mit Si1
    weitergeht, aber mindestens ein anderer Pfad geht
    weiter. Dann füge eine neue Kante mit Label
    Si1 ein. Dazu muß ein neuer Knoten erzeugt
    werden, wenn ß mitten in einer Kante endet. Gib
    dem neuen Blatt Nummer j.

7
Erweiterungsregeln
  • ß endet in einem Blatt. Dann füge i1 zum
    Kantenlabel hinzu.
  • Es gibt keinen Pfad am Ende von ß, der mit Si1
    weitergeht, aber mindestens ein anderer Pfad geht
    weiter. Dann füge eine neue Kante mit Label
    Si1 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 Si1
    weitergeht. In diesem Fall ist ßSi1 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 Bi in den Baum Bi1 umgewandelt werden.
Wir beschreiben jede Phase und zeichnen den Baum
immer, wenn die Phase beendet ist.
9
Einfügen von aGesamter String a
Es ist nur a Einzufügen! (Regel 2)
a
10
Einfügen von bGesamter String ab
In der ersten Erweiterung fügen wir ein b an
das vorhandene Blatt an. (Regel 1)
a b

11
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

12
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.
13
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
14
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
15
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
16
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
17
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
18
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
19
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.
20
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.
21
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.
22
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
23
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
24
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
25
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
26
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
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
  • 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 j1 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
  • Fall1Der 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(j1..i) ein neuer innerer
    Knoten s(v) angelegt, der die Beschriftung ? hat,
    weil es Suffixe mit den Präfixen ?y und ?S(i1)
    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 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 i1 gilt ebenfalls die Aussage.

36
Single extension algorithm (SEA)
  • Begin
  • Finde Knoten v über dem Ende von Sj-1..i.
  • Laufe eine Kante vom Ende von Sj-1..i
    hoch.
  • Sei nun y der String zwischen dem Ende von
    Sj-1..i und v.

37
Single extension algorithm (SEA)
  • Begin
  • Finde Knoten v über dem Ende von Sj-1..i.
  • Laufe eine Kante vom Ende von Sj-1..i
    hoch.
  • Sei nun y der String zwischen dem Ende von
    Sj-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 Sj..i von der Wurzel.

38
Single extension algorithm (SEA)
  • Begin
  • Finde Knoten v über dem Ende von Sj-1..i.
  • Laufe eine Kante vom Ende von Sj-1..i
    hoch.
  • Sei nun y der String zwischen dem Ende von
    Sj-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 Sj..i von der Wurzel.
  • Sorge gemäss den Erweiterungsregeln dafür, dass
    der String Sj..iS(i1) im Baum enthalten ist.

39
Single extension algorithm (SEA)
  • Begin
  • Finde Knoten v über dem Ende von Sj-1..i.
  • Laufe eine Kante vom Ende von Sj-1..i
    hoch.
  • Sei nun y der String zwischen dem Ende von
    Sj-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 Sj..i von der Wurzel.
  • Sorge gemäss den Erweiterungsregeln dafür, dass
    der String Sj..iS(i1) 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 Bi in den Baum Bi1 umgewandelt werden.
41
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
42
Einfügen von bGesamter String ab
In der ersten Erweiterung fügen wir ein b an
das vorhandene Blatt an.
a b

43
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

44
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.
45
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
46
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
47
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
48
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
49
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
50
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
51
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
In dieser Phase kommen die Suffix Links erst
richtig ins Spiel.
Erweiterung 1 bis 3 Wie zuvor auch fuegen wir
ein a an alle Aeste an.
52
Einfügen von aGesamter String abcabcaba
Diese Erweiterung erzeugt einen Knoten, der noch
keinen Suffix Link hat, aber wir wissen, dass
dieser in der naechsten Erweiterung hinzugefuegt
wird.
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
eingefuegt werden. Von der Wurzel laufen wir
abcab runter und fuegen ein a an.
53
Einfügen von aGesamter String abcabcaba
Diese Erweiterung erzeugt einen Suffix Link. Der
neue Knoten ist allerdings noch nicht
weiterverlinkt, was wieder in der
naechsten Erweiterung passieren wird.
a b c b c a c a b a b c b c a a c a
a b a b a b a a
Erweiterung 5 Jetzt muss der String bcaba
eingefuegt werden. Von der Wurzel laufen wir
bcab runter und fuegen ein a an.
54
Einfügen von aGesamter String abcabcaba
Diese Erweiterung erzeugt wie zuvor einen Suffix
Link.
a b c b c a c a b a b c a b c a a c
a a b a b a b a a
Erweiterung 6 Jetzt muss der String caba
eingefuegt werden. Von der Wurzel laufen wir cab
runter und fuegen ein a an.
55
Einfügen von aGesamter String abcabcaba
Diese Erweiterung erzeugt wie zuvor einen Suffix
Link.
a b c b c a c a a b a b c a b c a a c
a a b a b a b a a
Erweiterung 7 Jetzt muss der String aba
eingefuegt werden. Von der Wurzel laufen wir ab
runter und fuegen ein a an.
56
Einfügen von aGesamter String abcabcaba
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 a ist in
diesem Fall ein leerer String.
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
Erweiterung 8 Jetzt muss der String ba
eingefuegt werden. Von der Wurzel laufen wir b
runter und fuegen ein a an.
57
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
Erweiterung 9 Jetzt muss lediglich noch der
Character a eingefuegt werden. Dieser ist
allerdings schon vorhanden.
58
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
Unser Baum ist jetzt vollstaendig verlinkt und
die Phase ist beendet.
59
Einfügen von cGesamter String abcabcabac
Wir wissen, dass abcabcaba der laengste String im
Baum ist. Wir laufen diesen runter und fuegen
dort ein c an.
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 c
Erweiterung 1 Die erste Erweiterung ist immer
speziell. Wir muessen den String abcabcabac
einfuegen.
60
Einfügen von cGesamter String abcabcabac
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.
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 c c
Erweiterung 2 Wir muessen den String bcabcabac
einfuegen. Wir nutzen den Suffix Link.
61
Einfügen von cGesamter String abcabcabac
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.
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 c a c c
Erweiterung 3 Wir muessen den String cabcabac
einfuegen. Wir nutzen wieder den Suffix Link.
62
Einfügen von cGesamter String abcabcabac
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.
a b c b c a a c a a b a b c a b c a a
c a a b a c b a b a c a c c
Erweiterung 4 Wir muessen den String abcabac
einfuegen. Wir nutzen den zustaendigen Suffix
Link.
63
Einfügen von cGesamter String abcabcabac
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, das wir auch hochgegangen sind,
und fuegen dort ein c an.
a b c b c a a c a a b a b c a b c a a
c a a c b a c b a b a c a c c
Erweiterung 5 Wir muessen den String bcabac
einfuegen. Jetzt nehmen wir den ersten Suffix
Link.
64
Einfügen von cGesamter String abcabcabac
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, das wir auch hochgegangen sind,
und fuegen dort ein c an.
a b c b c a a c a a b a b c a b c a a
c c a a c b a c b a b a c a c c
Erweiterung 6 Wir muessen den String cabac
einfuegen. Dies passiert wie in Erweiterung 5.
65
Einfügen von cGesamter String abcabcabac
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.
a b c b 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
Erweiterung 7 und 8 Wir muessen den String abac
und bac einfuegen. Diese Vorgaenge sind
ebenfalls wie in Erweiterung 5.
66
Einfügen von cGesamter String abcabcabac
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.
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
Erweiterung 9 Wir muessen den String ac
einfuegen.
67
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
Erweiterung 10 Wir muessen den String c
einfuegen. Dieser existiert allerdings bereits
als Praefix im Baum.
68
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
Phase ist beendet und der Baum ist vollstaendig
verlinket.
69
Einfügen von dGesamter String abcabcabacd
Der gesuchte String ist der Laengste. Wir fuegen
d ein und merken uns die Position.
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 d
Erweiterung 1 abcabcabacd muss eingefuegt
werden. Es geht ebenso wie in der Phase zuvor!
70
Einfügen von dGesamter String abcabcabacd
Von der gemerkten Position gehen wir bis zum
Suffix Link hoch, diesen entlang und an
der Stelle die gleiche Bezeichnung wieder
herunter!
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 d
d
Erweiterung 2 bcabcabacd muss eingefuegt
werden. Es geht ebenso wie in der Phase zuvor!
71
Einfügen von dGesamter String abcabcabacd
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.
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 d a b
d a c a c d c d d
Erweiterung 3-5 cabcabacd, abcabacd, bcabacd
mussen eingefuegt werden.
72
Einfügen von dGesamter String abcabcabacd
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.
a b c b c c a a 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
Erweiterung 6-9 cabacd, abacd, bacd, acd mussen
eingefuegt werden.
73
Einfügen von dGesamter String abcabcabacd
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.
a b c 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
Es entsteht ein neuer Suffix Link zur Wurzel.
Erweiterung 9 cd muss eingefuegt werden.
74
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
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.
Erweiterung 11d muss eingefuegt werden.
75
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
Die Phase ist beendet und der Baum vollstaendig
verlinkt.
76
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
Nach der letzten Phase erhalten wir diesen Baum.
77
Trick Nr. 1 Skip/Count Trick
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.
Wir befinden uns an einem Knoten v, und das nun
zu erweiternde Suffix hat ein Praefix, welches
auf abcdefgh endet.
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
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.
Suffix Link
v
S(v)
a b c d
String y
e
G y 8, I 1,
f
g
h
i
j
80
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.
x
Suffix Link
v
S(v)
Aktuelle Position
z
a b c d
g
String y
e
G y 8, I 1,
f
g
h
Nun springen wir direkt zu diesem Knoten
i
j
81
Nun sind wir an dem Knoten. Wir haben 4 Zeichen
uebersprungen, also wird G auf G-4 gesetzt und I
auf 14. Dann gehts weiter, nach der Kante mit
dem 5ten Zeichen von y suchen und zum naechsten
Knoten springen.
x
Suffix Link
v
S(v)
z
a b c d
g
Aktuelle Position
String y
e
G G-4 4, I I4 5,
f
g
h
Nun springen wir weiter zu diesem Knoten
i
j
82
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.
x
Suffix Link
v
S(v)
z
a b c d
g
String y
e
G G-2 2, I I2 7
f
g
h
Aktuelle Position.
i
j
Ende von y
83
Wir haben nun das Ende von y gefunden und koennen
das Zeichen, z.B. ein w einfuegen.
x
Suffix Link
v
S(v)
z
a b c d
g
String y
e
f
g
h
Hier findet sich das Ende von y, und das Zeichen
kann eingefuegt werden.
i
j
84
W eingefuegt, es geht weiter mit der naechsten
Extension.
x
Suffix Link
v
S(v)
z
a b c d
g
String y
e
f
g
h
Hier findet sich nun ein neuer Knoten und ein Ast
mit Label w.
i
j
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)
  • --gt 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).
  • --gtDie 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
Ausschnitt aus dem Suffixbaum fuer den String
ALDACFALBALDACTALDACFALBN, ohne Links.
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
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
N
C F A L B A L D A C T
A L D A C F A L B N
N
D A C F A L B A L D
A C T A L D A C F A
L B N
N
89
Bei diesen Links ist die Tiefe von v um 1
groesser als die Tiefe von s(v).
S(v)
S(v)
S(v)
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
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
N
C F A L B A L D A C T
A L D A C F A L B N
N
D A C F A L B A L D
A C T A L D A C F A
L B N
v
v
v
N
90
Bei diesen Links ist die Tiefe von v um 1 kleiner
als die Tiefe von s(v).
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
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
v
v
N
C F A L B A L D A C T
A L D A C F A L B N
S(v)
S(v)
N
D A C F A L B A L D
A C T A L D A C F A
L B N
N
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, --gt O(m)

94
Corollar
Es gibt m Phasen mit O(m), also insgesamt
O(mm). 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25
2 - 2
3 - 5
6 - 10
11 -
25
25 - 25
11 -
25
6 - 10
25 - 25
1-1
11 -
25
6 - 10
3 - 3
2-2
25 - 25
11 -
25
6 - 10
3 - 5
25 - 25
97
Single Phase Algorithm(SPA)
  1. Setze e auf i1.
  2. Führe mit Hilfe vonSuffix-Links Erweiterungen
    durch, bis in Erweiterung j Regel 3 angewandt
    wird.
  3. Setze ji1 auf j-1 und gehe zur nächsten Phase.
Write a Comment
User Comments (0)
About PowerShow.com