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