AUTOMATENBASIERTE ALGORITHMEN
UND EXAKTES 2D-PATTERN-MATCHING
Vincent Holluba
Gliederung
Einleitung und Wiederholung
Suchwortbaum (Trie)
Aho-Corasick Automat
1.
2.
3.
i.
ii.
4.
5.
Matching mit Wildcards
2D-Pattern Matching
Matching regulärer Ausdrücke
Zusammenfassung
Motivation
Problem von Standardalgorithmen:
Text wird immer nur nach Auftreten eines Wortes
durchsucht
Wenn m Worte in einem Text mit Länge n gesucht
werden sollen wird eine Laufzeit von O(n*m)
benötigt
Geht es besser?
Endlicher Automat
Ein deterministischer endlicher Automat G=(Σ;Q;init;d;T)
besteht aus:
Σ … Eingabealphabet
Q… Zustandsmenge
init … Startzustand (init ∈ Q)
d … Übergangsfunktion ((q,a) ∈ Q x Σ q‘∈ Q)
T … Endzustandsmenge (T ∈ Q)
Bei nfa:
zu einem Eingabezeichen verschiedene Möglichkeiten des
Zustandsübergangs
Zustandsübergänge ohne das Lesen eines Zeichens möglich
Beispiel endlicher Automat
Σ ={0,1}
Q={Z1,Z2}
init=Z1
T = {Z1}
d wird durch die folgende Übergangstabelle
beschrieben:
0
1
Z1
Z2
Z1
Z2
Z1
Z2
Beispiel endlicher Automat
Übergangsfunktion als Graph
1
0
Z1
1
Z2
0
Suchwortbaum
Ein Suchwortbaum (Trie) für eine Menge S von
Wörtern aus Σ + ist ein gewurzelter Baum K mit:
Jede
Kante von K ist mit einem Zeichen aus Σ markiert
(gelabelt)
Die von einem Knoten ausgehenden Kanten besitzen
paarweise verschiedene Markierungen
Suchwortbaum
Definition:
Die Markierung L(v) eines Knoten v wird definiert als
die Verknüpfung der Kantenmarkierungen welche auf
dem Weg von der Wurzel zum Knoten v durchlaufen
werden.
Für jedes Wort s ∈ S existiert ein Knoten v, so dass
L(v)=s
Für jedes Blatt ist L(v)=s
Konstruktion eines Suchbaumes
S={s1,…,sn}
(1)
(2)
(3)
(4)
(5)
(6)
Erstelle Wurzelknoten
Für i=1 bis n tue
Starte am Wurzelknoten
Folge dem Weg welcher durch die Buchstaben von si
beschrieben wird
Wenn der Pfad endet und si noch Buchstaben enthält, dann
erstelle neue Knoten und Kanten für die restlichen
Buchstaben von si
Speichere den Identifier i von si im Endknoten des Weges
Laufzeit: O(|s1|+…+|sn|)=O(m)
Beispiel Suchbaum
S={he, she, his, hers}
h
s
e
1
r
s
i
h
e
s
3
1,2
4
Textsuche mit Hilfe eines Suchbaumes
Durchlaufe den Baum anhand der Buchstaben des
Textes
Wenn man einen Knoten mit Identifier i erreicht,
dann hat man das Auftreten des Wortes si gefunden
Wenn der Text endet, bevor man einen Knoten mit
Identifier i erreicht hat, dann enthält der Text keine
Wörter aus S
Wie verhält man sich wenn man in Sackgassen
(Knoten von denen keine Kante mit gesuchter
Beschriftung ausgeht) landet?
Textsuche mit Hilfe eines Suchbaumes
t=hhe
h
s
e
1
r
s
i
h
e
s
3
1,2
4
Textsuche mit Hilfe eines Suchbaumes
Verhalten bei Sackgasse:
Naiv:
Wenn ein Suchlauf, welcher mit dem i-ten
Buchstaben des Textes begann in einer Sackgasse
endet, dann beginne Suchlauf mit i+1-ten Buchstaben
Es
geht natürlich besser: Dazu wird der Suchbaum zu
einem Automaten erweitert
Aho-Corasick Automat
Zustandsmenge Q besteht aus den Knoten des
Suchbaumes
init=Wurzelknoten
Besitzt ein Knoten im Suchbaum einen Identifier I,
dann existiert für den Zustand im AC-Automat eine
Ausgabefunktion Ausgabe(q) welche den Identifier
ausgibt
Aho-Corasick Automat
Übergangsfunktion:
Wenn im Suchbaum die Kante (q,v) mit a beschriftet
ist, dann ist d(q,a)=v=q‘
d(init,a)=init für jeden Buchstaben der keine aus der
Wurzel ausgehende Kante beschriftet
d(q,a)= fail(q) sonst
fail(q) wird Fehler-Link (Failure-Link) oder auch
Fehlerfunktion genannt
Aho-Corasick Automat
Die Fehlerfunktion verweist auf einen Zustand q‘
Für q‘ gilt: L(q‘) entspricht dem längsten Suffix des
bereits erkannten Teilwortes
Die Fehlerfunktion führt die Übergangsfunktion des
Zustandes q‘ aus. (d(q,a)=fail(q)= d(q‘,a))
Aho-Corasick Automat
≠ {h,s}
h
s
e
1
r
s
i
h
e
s
3
1,2
4
Aho-Corasick Automat
AC Automat Suche:
Starte
im Zustand init
Solange wie Buchstaben im Text t tue
Nimm
vordersten Buchstaben a aus t
Führe d(q,a) aus
Führe ggf. Ausgabe(q) aus
Aho-Corasick Automat
Beispiel: hhehhishe
h
≠
{h,s}
s
e
s
i
h
Ausgabe:1,3,1,2
1
r
e
s
3
1,2
4
Aho-Corasick Automat
Kontruktion:
Die Konstruktion eines AC-Automat kann in 2 Phasen
unterteilt werden:
Phase 1:
Konstruiere den Suchbaum für S
Bestimme die Zustandsmenge Q, die Übergangsfunktion d(q,a)
und die Ausgabefunktion Ausgabe(q) anhand des Suchbaumes
d(init,a)=init für jeden Buchstaben der keine aus der Wurzel
ausgehende Kante beschriftet
Setze d(q,a)= fail(q) für jeden Buchstaben der keine aus v
ausgehende Kante beschriftet
benötigte Laufzeit: O(|s1|+…+|sn|)=O(m)
Aho-Corasick Automat
h
≠
{h,s}
s
e
1
r
s
i
h
e
s
3
1,2
4
Aho-Corasick Automat
Kontruktion:
1.
2.
3.
4.
5.
6.
Phase 2:
Rekursiver Algorithmus zur Bestimmung der Failure Links
Für alle v∈V (im Suchbaum) //Durchlaufe Levelweise
KMarkierung=Markierung(Kante(Vater(v),v));
w=Fail(Vater(v));
Solange wie keine Kante(w,x) für alle x∈V mit
Markierung(Kante(w,x))==KMarkierung und w nicht die Wurzel
ist dann setze w=Fail(w);
Wenn eine Kante(w,x) mit
Markierung(Kante(w,x))==KMarkierung existiert, dann setze
Fail(v)=x
Sonst setze Fail(v)=init
Induktion
Aho-Corasick Automat
≠ {h,s}
h
s
e
1
r
s
i
h
e
s
3
2
4
Aho-Corasick Automat
Laufzeit der Fehler-Link Berechnung
Behauptung: Die Laufzeit der Fehler-Link Berechnung beträgt O(m)
O(|s1|+…+|sn|)=O(m)
Um dies zu zeigen betrachten wir ein Suchwort s∈S
Wir zeigen: Für die Berechnung der Fehler-Links im Pfad von s
werden O(|s|) Vergleiche benötigt
Klar: Für jeder Knoten kann es nur einen erfolgreichen Vergleich
geben
Erfolglose Vergleiche verweisen immer auf Knoten mit niedrigerer
Tiefe Da wir nur bei einem erfolgreichen Vergleich ein Level
höher gehen können und das Level nie negativ ist, kann es maximal
|s| erfolglose Vergleiche geben
Deshalb ist die Laufzeit für ein Suchwort s∈S mit O(|s|) beschränkt
und damit die Gesamtlaufzeit mit O(|s1|+…+|sn|)=O(m)
Aho-Corasick Automat
Laufzeit AC Suche:
Behauptung: Einen Text mit dem Aho-Corasick Automaten zu
durchsuchen benötigt O(n+m) Zeit (n=|t|, m=|S|)
Beweis: Für jeden Buchstaben führt der Automat 0 oder
mehr erfolglose und genau einen erfolgreichen Vergleich
aus.
Jeder erfolgreiche Vergleich erhöht die Tiefe von q um
1Die Tiefe von q wird ≤ n mal erhöht
Jeder erfolglose Vergleich verringert die Tiefe von q um
mind. 1 Die maximale Anzahl von erfolglosen Vergleichen
ist ≤ n Suche O(n)
Das Auftreten eines gefundenen Wortes kann in O(1)
Ausgegeben werdenm*O(1)=O(m)
Matching mit Wildcards
Anwendung: Suchen von Worten welche
nicht genau bekannt sind
Wir nennen φ∉ Σ, das jedes
Zeichen a∈ Σ matcht Wildcard (Joker)
Aufgabe: Exaktes finden von einem Suchwort s mit
Wildcards in einen Text t ohne Wildcards
Matching mit Wildcards
Unser Wort besitzt die Form:
s = φ…s1…φ…s2…φ…sk…φ
In s1…sk befindet sich keine Wildcard
Definiere Multimenge S={s1,…,sk}
Bestimme Vektor v, welcher die Anfangspositionen
der si∈ S beinhaltet v=(v1,…,vk)
Matching mit Wildcards
Zusätzlich wird ein Kontrollarray K der Länge |t|
angelegt
Führe den AC Algorithmus auf dem Text t mit den
Suchwörtern S={s1,…,sk} aus
In K wird bei einem Matching eines Teilwortes si an der
Position j im Text t an der Stelle K(j-vj+1) der Wert des
Feldes um 1 inkrementiert
Bei jedem Auftreten eines Teilwortes si wird die Stelle in
K erhöht an welcher s beginnen könnte
Ist der gesamte Text durchlaufen und in K besitzt mind.
ein Feld den Wert k, dann haben wir eine/mehrere
Anfangspositionen für s gefunden
Zweidimensionales Matching
Where is Waldo?
Zweidimensionales Matching
2D-Matching – Beziehung zur Bildverarbeitung
Große Datenmengen in Form von Pixeldaten
Das Erkennen eines 2D-Musters ist wie folgt
definiert: Finde ein mxm‘ Muster PAT in einem nxn‘
(text) Feld T
Die Position des Auftretens vom Muster ist durch ein
Tupel (i,j) definiert.
i
j
PAT
Zweidimensionales Matching
Lösungsansatz: Übersetzen des Problems in ein
String-matching Problem
Sei S die Menge von allen unterschiedlichen Spalten
des Musters (Wörter)
Baue AC Automat für Spaltenwörter und führe
Berechnung durch
Schreibe dabei in ein 2D-Array die Ausgabe(q), ist
die Ausgabe(q) nicht definiert schreibe 0
Zweidimensionales Matching
In
Beispiel: Suche Muster
a
a
a
b
b
a
a
a
b
a
b
a
b
a
b
b
a
a
a
a
b
b
b
b
b
b
a
a
a
b
a
a
a
b
b
a
a
b
b
a
a
a
b
b
a
a
b
a
a
a
a
Zweidimensionales Matching
Erstellter AC-Automat für Wörter („aba“,“aab“)
0
0
a
b
1
a
0
b
0
a
2
a
a
a
b
b
a
a
a
b
Zweidimensionales Matching
a
b
a
b
a
b
b
a
a
a
a
b
b
b
b
b
b
a
a
a
b
a
a
a
b
b
a
a
b
b
a
a
a
b
b
a
a
b
a
a
a
a
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
2
0
0
2
2
2
1
0
0
0
0
0
0
2
2
1
0
2
2
1
0
0
2
2
Zweidimensionales Matching
Das nun erstelle 2D-Array wird Zeile für Zeile nach
dem Auftreten des Strings welcher das auftreten
des Musters darstellt durchsucht (Beispiel „221“) z.B.
mit AC Automat oder KMP
Jedes Auftreten des Strings stellt nun ein Auftreten
des Musters im Ausgangsbild dar
Zweidimensionales Matching
Durchsuche Text nach Auftreten von Wort „221“
0
0
0
0
0
0
0
a
b
a
b
a
b
b
0
0
0
0
0
0
0
a
a
a
a
b
b
b
1
0
1
0
2
0
0
b
b
b
a
a
a
b
2
2
2
1
0
0
0
a
a
a
b
b
a
a
0
0
0
2
2
1
0
b
b
a
a
a
b
b
2
2
1
0
0
2
2
a
a
b
a
a
a
a
Intermezzo:
Google:“String Matching Automat“
Matching von regulären Ausdrücken
Gegeben ein Text t und ein regulärer Ausdruck R
Gibt es ein Teilwort w in t mit w∈R?
Einsetzbarkeit:
Wortfilter
Compilterbau
…
Matching von regulären Ausdrücken
Induktive Definition:
1.
2.
3.
∅ und ∈ sind reguläre Ausdrücke, für jedes a∈ Σ ist a
ein regulärer Ausdruck
Sind α und β reguläre Ausdrücke, dann sind auch die
Vereinigung/Alternative (α+β), die
Konkatenation/Verkettung (αβ) und der KleeneAbschluss (α)* reguläre Ausdrücke
Nichts sonst ist ein regulärer Ausdruck
Matching von regulären Ausdrücken
Zu jedem regulären Ausdruck lässt sich ein
nichtdeterministischer endlicher Automat (nea, nfa)
konstruieren, welcher den regulären Ausdruck
akzeptiert (Beweis: siehe alte Vorlesungen)
Jeder Zustandsübergang besitzt ein Label a ∈ Σ∪∈
Matching von regulären Ausdrücken
Konstruktionsbeschreibung des nfa
1. R=a
q
a
f
Matching von regulären Ausdrücken
Konstruktionsbeschreibung des nfa
R=(α+β) (Vereinigung/Alternative)
∈
q1
a
α
f1
∈
q
f
∈
q2
β
f2
∈
Matching von regulären Ausdrücken
Konstruktionsbeschreibung des nfa
R=(αβ) (Konkatenation/Verkettung)
q1
α
f1=q2
β
f2
Matching von regulären Ausdrücken
Konstruktionsbeschreibung des nfa
R= (α)* (Kleene-Abschluss)
∈
q
q1
∈
a
α
∈
f1
∈
f
Matching von regulären Ausdrücken
Beispiel:R=(z+w)((e+t)(m+l+i))*((e+s)(r+t))*
∈
q
w
z
1
∈
t
i
e
l
2
m
3
s
e
4
t
r
f
Matching von regulären Ausdrücken
Der konstruierte Automat hat folgende
Eigenschaften:
Da
in jedem Schritt höchtens 2 Zustände in den Automat
eingefügt werden besitzt der Automat höchstens 2*|R|
Zustände
Die Anwendung jeder Regel benötigt konstante Zeit
Die Konstuktion benötigt O(m) Zeit mit m=|R|
Matching von regulären Ausdrücken
Simulation:
Q
sei die aktuelle Zustandsmenge
A(Q,a) sei die Menge aller Zustände die von Q aus
über eine mit a markierte Kante erreicht werden
können
E(Q) sei die Menge aller Zustände die von Q aus über
eine mit ∈ markierte Kante erreicht werden können
Startzustand q befindet sich immer in Q (Wort kann an
jeder Stelle im Text anfangen)
f Endzustand
Matching von regulären Ausdrücken
Simulation:
Erstelle nfa
Q=E({q})
Wenn f ∈ Q dann Wort des RA gefunden
For i=1 to n do
1.
2.
3.
4.
1.
2.
5.
Q=E({A(Q,t[i])} ∪{q})
Wenn f ∈ Q dann Wort des RA gefunden
Sonst: Wort nicht gefunden
Matching von regulären Ausdrücken
Laufzeit Simulation: O(n*m) n=|t| m=|R|
Beweisansatz: Die Konstruktion des nfa benötigt
O(m) Schritte. Die For Schleife der Simulation wird n
mal durchlaufen, das Update der Zustandsmenge Q
benötigt in jedem Durchlauf O(m) Schritte
Laufzeitverbesserung durch Umwandeln des nfa in
dfa möglich. Problem: Die Anzahl der Zustände
eines dfa ist exponentiell zur Anzahl der Zustände
eines nfa. In Spezialfällen kann sich eine
Umwandlung lohnen
Zusammenfassung
Aho-Corasick Automat:
Exaktes
Suchen von mehreren Suchworten
Exaktes Suchen mit Wildcards
Exaktes 2D-Pattern Matching
Laufzeit O(m+n)
Matching von Regulären Ausdrücken mit nfa in
O(m*n)
Abschlussbemerkung
t=„deutschland wird weltmeister“
∈
q
w
z
1
∈
t
i
e
l
2
m
3
s
e
4
t
r
f
Danke für ihre Aufmerksamkeit
52
Quellen
M. Crochemore, W. Rytter: „Jewels of Stringology“
Dan Gusfield: „Algorithms on Strings, Trees and Sequenes“
Peter Weiner: “Linear Pattern Matching Algorithms“
http://www.cs.uni-paderborn.de/fileadmin/Informatik/FG-TI/GA09/GA7Strings.pdf
http://www.cs.uku.fi/~kilpelai/BSA05/lectures/slides04.pdf
http://www14.informatik.tu-muenchen.de/lehre/2009SS/cb/slides/CB1-2009-0428.pd
http://theo.cs.uni-magdeburg.de/lehre06w/textalg/beispiele/beispiel-ac.pdf
http://www.codeproject.com/KB/recipes/ahocorasick.aspx
Aho-Corasick Automat
Induktionsanfang: Für Knoten v mit Abstand 1 setze
den Fehler-Link auf die Wurzel fail(v)=init
Induktionsannahme: Die Fehlerlinks für Knoten mit
Abstand ≤k zur Wurzel init sind bekannt
Induktionsschritt: Sei v ein Knoten mit Abstand k+1
zur Wurzel. Gesucht: fail(v)
Aho-Corasick Automat
Es existiert genau ein Vorgänger von v und eine
Markierung x der Kante (Vater(v),v)
Der Vorgänger von v hat Abstand k von der Wurzel
wir kennen seinen Fehler-Link
L(Fail(v)) muss ein Suffix von L(Fail(Vater(v)))*x sein
Besitzt der Knoten Fail(Vater(v)) eine ausgehende Kante mit
Zeichen x zu einem Knoten w, dann setzen wir Fail(v)=w
Wenn am Knoten Fail(Vater(v)) keine ausgehende Kante mit
Zeichen x existiert, dann kennen wir Fail(Fail(Vater(v))) …
zurück