www.wikidata.de-de.nina.az
Der Knuth Morris Pratt Algorithmus wurde nach Donald E Knuth James H Morris und Vaughan Pratt benannt und ist ein String Matching Algorithmus Seine asymptotische Laufzeit ist linear in der Lange des Musters auch Suchbegriff Suchmaske nach dem gesucht wird plus der Lange des durchsuchten Textes Pratt entwickelte 1970 die Grundidee unabhangig von Knuth der etwas spater darauf stiess und Pratt und Morris veroffentlichten 1970 einen Technischen Bericht dazu 1 Schliesslich veroffentlichten alle drei 1977 einen Aufsatz dazu 2 Inhaltsverzeichnis 1 Beschreibung 1 1 Suche 1 1 1 Beobachtungen 1 2 Prafix Analyse 2 Implementierung 2 1 Prafix Analyse 2 2 Suche 3 Laufzeitanalyse 3 1 Laufzeit der Prafix Analyse 3 2 Laufzeit der Suche 3 3 Zusammen 4 Siehe auch 5 Literatur 6 Weblinks 7 EinzelnachweiseBeschreibung BearbeitenDer Knuth Morris Pratt Algorithmus baut auf dem Naiven Suchalgorithmus auf Wesentlicher Unterschied ist dass das Vergleichsfenster nicht immer um nur eine Position weitergeruckt wird sondern eventuell um mehr als eine Position Dazu muss zu Anfang die Suchmaske auf Zeichenfolgen analysiert werden die ein moglichst langes Prafix des Musters selbst sind Es wird vom Algorithmus dann eine Tabelle erstellt die zu jedem Prafix der Lange j die Lange des echten Randes des Prafixes enthalt also die maximale Anzahl von Zeichen innerhalb des Prafixes des Suchmusters die gleichzeitig Suffix und Prafix desselben sind Es ist definiert dass ausserdem die Lange des echten Randes fur ein Prafix der Lange Null gleich 1 ist Dies wird spater im Algorithmus beim Suchen hilfreich sein Folgendes Beispiel veranschaulicht das Gesagte bildlich LangePosition 0 1 2 3 4 5 6 7 8Muster a b a b c a b a b 9Prafix 0 0 0Prafix 0 1 0Prafix 0 2 a a 1Prafix 0 3 a b a b 2Prafix 0 4 0Prafix 0 5 a a 1Prafix 0 6 a b a b 2Prafix 0 7 a b a a b a 3Prafix 0 8 a b a b a b a b 4Wahrend der Suche wird nun zunachst so vorgegangen wie bei der naiven Suche Es wird an Position 0 begonnen die Zeichen von Text und Suchmaske zu vergleichen so lange bis zwei Zeichen nicht mehr ubereinstimmen oder die Suchmaske gefunden wurde Wurde die Suchmaske gefunden ist der Algorithmus abgeschlossen Stimmen die Zeichen vor einem vollstandigen Treffer nicht uberein so wird die Suchmaske um die Differenz zwischen der Anzahl der ubereinstimmenden Zeichen und der Lange des Randes des Prafixes nach rechts verschoben Hier kommt die vorherige Definition der Lange des Randes eines Prafixes der Lange Null ins Spiel die Differenz zwischen 0 und 1 ist 1 folglich wird also bei einem nicht ubereinstimmenden Zeichen an erster Stelle um eins nach rechts verschoben Ausserdem wird dann mit der Suche um die Lange des Randes des Prafixes oder Null falls der Rand kurzer als Null ist weiter rechts begonnen Bei jeder teilweisen Ubereinstimmung etwa der ersten k Symbole ist nun also bekannt ob der Anfang der Suchmaske mit dem Ende der letzten ubereinstimmenden Teilmaske ubereinstimmt Die Verschiebung der Suchmaske erfolgt nach der uberlappenden Ubereinstimmung zusatzlicher Vorteil ist dass die schon verglichenen Symbole nicht noch einmal verglichen werden mussen Die so gewonnene Information wird so wahrend der Suche verwendet um wiederholte Vergleiche zu vermeiden Folglich gliedert sich der Algorithmus in zwei Phasen namlich die Prafix Analyse die das Muster selbst analysiert und die eigentliche Suche Suche Bearbeiten Als Beispiel suchen wir im Text abababcbababcababcab nach dem Muster ababcabab Wie beim Naiven Algorithmus wird das Muster linksbundig unter den Text geschrieben und die Buchstabenpaare werden von links nach rechts verglichen bis Muster und Text nicht mehr ubereinstimmen Auftreten eines Fehlers Position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Text a b a b a b c b a b a b c a b a b c a b Muster a b a b c a b a bDer erste Fehler wird an Position 4 im Text festgestellt Betrachten wir die zuvor berechnete Tabelle mit der Lange der Rander eines Prafixes an der Stelle Prafix 0 3 so sehen wir dass hier die Lange 2 hinterlegt ist Das Muster wird also um 2 Zeichen nach rechts verschoben sodass es sich mit dem Suffix also dem zweiten Teil des Randes passend uberlappt ausserdem wird mit der Suche direkt nach dem Rand fortgefahren da wir ja bereits wissen dass die beiden Teile ubereinstimmen dies ist die grosse Starke des KMP Algorithmus Position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Text a b a b a b c b a b a b c a b a b c a b Muster a b a b c a b a bDer Algorithmus fahrt also bei Position 4 also genau dort wo zuvor ein Fehler gefunden wurde mit dem Vergleichen fort Insbesondere wird der Rand ab nicht nochmals uberpruft Position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Text a b a b a b c b a b a b c a b a b c a b Muster a b a b c a b a bDer nachste Fehler tritt bei Position 7 im Text und damit bei Position 5 im Suchmuster auf Wir betrachten wieder unsere Tabelle bei Prafix 0 4 sie besagt dass es hier keine Zeichen gibt die einen Rand bilden Lange Null Wir konnen jetzt also sicher sein dass es keine Treffer gibt durchsuchten wir die Zeichen bis Position 7 durch naives Schieben nach rechts um ein Zeichen Deshalb kann das Muster bis unter die Stelle 7 im Text geschoben werden das Ergebnis von Suchtextposition Anzahl der Ubereinstimmenden Zeichen Randlange Prafixlange also 2 5 0 7 Position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Text a b a b a b c b a b a b c a b a b c a b Muster a b a b c a b a bDer Algorithmus fahrt dann wieder bei Position 7 mit dem Vergleichen fort Position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Text a b a b a b c b a b a b c a b a b c a b Muster a b a b c a b a bManchmal tritt wie hier bereits an der ersten Stelle des Musters ein Fehler auf In diesem Fall wird das Muster um 1 nach rechts geschoben Suchtextposition Anzahl der Ubereinstimmenden Zeichen Randlange Prafixlange also 7 0 1 8 und der Algorithmus fahrt hier an der nachsten Stelle im Text also 8 mit Vergleichen fort Position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Text a b a b a b c b a b a b c a b a b c a b Muster a b a b c a b a bWurden alle Zeichen des Musters im Text gefunden so wird ein Treffer ausgegeben Da die zuletzt uberpruften vier Zeichen abab an Position 13 bis 16 ein Prafix der Lange 4 sind wird das Muster an Stelle 13 verschoben Das Vergleichen wird wieder an Stelle 17 13 4 fortgesetzt Position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Text a b a b a b c b a b a b c a b a b c a b Muster a b a b c a b Der Algorithmus endet sobald das Muster nicht weiter nach rechts verschoben werden kann ohne uber das Ende des Textes hinaus zu ragen oder sobald das Ende des Textes erreicht ist Beobachtungen Bearbeiten Der Text wird genau einmal durchlaufen Der Algorithmus bewegt sich entweder im Text weiter nach rechts oder er bleibt im Text stehen und verschiebt das Muster Soll das Muster verschoben werden und steht vor dem gerade uberpruften Zeichen ein Prafix der Lange k so wird das Muster so weit verschoben dass die ersten k Zeichen nicht nochmals uberpruft werden Prafix Analyse Bearbeiten Um alle langsten Prafixe im Muster zu finden wird vor der eigentlichen Suche das Muster analysiert Dazu schreibt man unter das erste Zeichen im Muster 1 und unter jedes weitere Zeichen die Anzahl der direkt vorangegangenen Zeichen die ein Prafix des Musters bilden ohne am Anfang des Musters zu beginnen Wir bearbeiten als Beispiel wieder das Muster ababcabab Muster Wert Bemerkunga 1 Sonderfall am Anfang des Musters b 0 Ohne am Anfang des Musters zu beginnen gibt es keine vorangehenden Zeichen a 0 Die vorangehenden Zeichen ohne am Anfang des Musters zu beginnen sind b Dies ist kein Prafix des Musters b 1 Die vorangehenden Zeichen ohne am Anfang des Musters zu beginnen sind ba Nur das a ist auch Prafix des Musters c 2 Die vorangehenden Zeichen ohne am Anfang des Musters zu beginnen sind bab Nur das ab ist auch Prafix des Musters a 0 Die vorangehenden Zeichen ohne am Anfang des Musters zu beginnen sind babc Das Prafix ab ist zwar enthalten steht jedoch wegen des c s nicht direkt vor diesem a b 1 Die vorangehenden Zeichen ohne am Anfang des Musters zu beginnen sind babca Nur das a ist auch Prafix des Musters a 2 Die vorangehenden Zeichen ohne am Anfang des Musters zu beginnen sind babcab Nur das ab ist auch Prafix des Musters b 3 Die vorangehenden Zeichen ohne am Anfang des Musters zu beginnen sind babcaba Nur das aba ist auch Prafix des Musters 4 Die letzten Zeichen des Musters ohne am Anfang zu beginnen sind babcabab Nur das abab ist auch Prafix des Musters So ergibt sich fur das Muster ababcabab die folgende Prafix Tabelle Beachte dass die letzte Zeile der Tabelle um ein Feld langer ist als das Muster Prafix Tabelle fur ababcabab Position 0 1 2 3 4 5 6 7 8 9Muster a b a b c a b a bWert 1 0 0 1 2 0 1 2 3 4Zum Vergleich obige Tabelle LangePosition 0 1 2 3 4 5 6 7 8Muster a b a b c a b a b 9Prafix 0 0 0Prafix 0 1 0Prafix 0 2 a a 1Prafix 0 3 a b a b 2Prafix 0 4 0Prafix 0 5 a a 1Prafix 0 6 a b a b 2Prafix 0 7 a b a a b a 3Prafix 0 8 a b a b a b a b 4Implementierung BearbeitenEs folgt der Algorithmus beschrieben in Pseudocode Eingabe seien ein Text t der Lange m und ein Muster w der Lange n Fur jedes Vorkommen des Musters w im Text t soll die Anfangsposition des Wortes im Text ausgegeben werden Wir fassen Muster und Text als Array auf die beginnend mit Null nummeriert sind Also ist z B w 0 das erste Zeichen des Musters und t 8 das neunte Zeichen des Textes Es ist ubliche Praxis die Nummerierung mit 0 zu beginnen Prafix Analyse Bearbeiten Zunachst wird die Prafix Analyse durchgefuhrt Sie erstellt die oben besprochene Prafix Tabelle hier nur die letzte Zeile als Array N die fur jedes Zeichen des Musters die Lange des direkt vorhergehenden Prafixes enthalt Eingabe ist ein Muster w der Lange n Ausgabe ist das Array N der Lange n 1 in Pseudocode i 0 Variable i zeigt immer auf die aktuelle Position j 1 im Muster Variable j gibt die Lange des gefun denen Prafixes an N i j Der erste Wert ist immer 1 while i lt n solange das Ende des Musters nicht erreicht ist while j gt 0 and w j w i Falls sich ein gefundenes Prafix nicht verlangern lasst j N j nach einem kurzeren suchen end an dieser Stelle ist j 1 oder w i w j i i 1 Unter dem nachsten Zeichen im Muster j j 1 den gefundenen Wert mindestens 0 N i j in die Prafix Tabelle eintragen end Derselbe Code in Python def prefix muster laenge Laenge des gefundenen Prefix laengePrefix 1 Der erste Wert ist immer 1 prefixTabelle laengePrefix solange das Ende des Musters nicht erreicht ist for positionImMuster in range 0 laenge solange sich ein gefundenes Prefix nicht verlaengern laesst nach einem kuerzeren suchen while laengePrefix gt 0 and muster laengePrefix muster positionImMuster laengePrefix prefixTabelle laengePrefix an dieser Stelle ist laengePrefix 1 oder muster positionImMuster muster leangePrefix laengePrefix laengePrefix 1 den gefundenen Wert an die prefixTabelle anhaengen prefixTabelle append laengePrefix return prefixTabelle Suche Bearbeiten Die zweite Phase ist die Suche Da das Muster naturlich nicht wirklich unter den Text geschrieben und dann verschoben wird werden zwei Variablen i und j eingesetzt Dabei gibt i die aktuelle Position im Text und j die aktuelle Position im Muster an Die Bedeutung ist dass immer Stelle j des Musters unter Stelle i des Textes steht Beispiel fur i 5 und j 3 i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Text a b a b a b c b a b a b c a b a b c a b Muster a b a b c a b a bj 0 1 2 3 4 5 6 7 8Eingabe sind das Muster w der Lange n das Array N der Lange n 1 aus der ersten Phase und ein Text t der Lange m Ausgabe sind alle Positionen an denen w in t vorkommt i 0 Variable i zeigt immer auf die aktuelle Position im Text j 0 Variable j auf die aktuelle Position im Muster while i lt m also Textende nicht erreicht while j gt 0 and t i w j Muster verschieben bis Text und Muster an Stelle j N j i j ubereinstimmen Dabei Array N benutzen end i i 1 In Text und Muster je eine j j 1 Stelle weitergehen if j n then Ist das Ende des Musters erreicht einen Treffer melden Dieser begann print i n bereits n Zeichen fruher j N j Muster verschieben end if end Derselbe Code in Python def suche muster prefixTabelle text positionImMuster 0 musterLaenge len muster solange das Ende des Textes nicht erreicht ist for positionImText in range 0 len text Muster verschieben bis Text und Muster an Stelle positionImText positionImMuster uebereinstimmen while positionImMuster gt 0 and text positionImText muster positionImMuster Dazu wird die Prefix Tabelle verwendet positionImMuster prefixTabelle positionImMuster positionImMuster positionImMuster 1 falls das Ende des Musters erreicht ist if positionImMuster musterLaenge einen Treffer melden Der Treffer beginnt bereits musterLaenge 1 Zeichen frueher print positionImText musterLaenge 1 Muster verschieben positionImMuster prefixTabelle positionImMuster Laufzeitanalyse BearbeitenDie Laufzeit wird wie ublich in der Landau Notation angegeben Laufzeit der Prafix Analyse Bearbeiten Die aussere while Schleife wird hochstens n mal durchlaufen da am Anfang i 0 gilt und i bei jedem Schritt um 1 erhoht wird In der inneren while Schleife wird bei jedem Durchlauf j auf einen zuvor berechneten kleineren Wert von j gespeichert in N j gesetzt Diese Schleife wird also insgesamt hochstens so oft durchlaufen wie j erhoht wurde Da j nur in der ausseren Schleife erhoht wird wird die innere Schleife insgesamt hochstens n mal durchlaufen Allerdings muss auch das ganze Muster durchlaufen werden Deshalb ist die Laufzeit der Prafix Analyse also in 8 n displaystyle Theta left n right nbsp Laufzeit der Suche Bearbeiten Die aussere while Schleife wird hochstens m mal durchlaufen da am Anfang i 0 gilt und i bei jedem Schritt um 1 erhoht wird Analog zur Phase der Prafix Analyse wird auch die innere while Schleife insgesamt hochstens m mal durchlaufen Da auch hier der gesamte Text durchlaufen wird ist die Laufzeit in 8 m displaystyle Theta left m right nbsp Zusammen Bearbeiten Da Prafix Analyse und Suche nacheinander ausgefuhrt werden ist die Laufzeit des gesamten Algorithmus in 8 n m displaystyle Theta left n m right nbsp Insgesamt werden hochstens 2 n m displaystyle 2 left n m right nbsp Vergleiche zwischen Zeichen des Musters und des Textes durchgefuhrt Damit kann der Algorithmus von Knuth Morris und Pratt eine bessere worst case Laufzeit garantieren als der Algorithmus von Boyer und Moore mit 8 n m displaystyle Theta left n cdot m right nbsp Allerdings kann Boyer Moore eine Suche unter bestimmten Umstanden in 8 n m displaystyle Theta left n m right nbsp durchfuhren Knuth Morris Pratt benotigt immer linear viele Vergleiche Siehe auch BearbeitenListe von Algorithmen Boyer Moore AlgorithmusLiteratur BearbeitenD E Knuth J H Morris V R Pratt 1977 Fast Pattern Matching in Strings In SIAM Journal of Computing 6 2 323 350 doi 10 1137 0206024 Yu V Matiyasevich Real time recognition of the inclusion relation In Journal of Soviet Mathematics Band 1 Nr 1 1973 S 64 70 doi 10 1007 BF01117471 Weblinks BearbeitenEine ausfuhrlichere Erklarung bei der Hochschule Flensburg Christian Charras Thierry Lecroq Knuth Morris Pratt algorithm Universite de Rouen auf der Webseite www igm univ mlv fr englisch University of British Columbia Knuth Morris Pratt String Search Webseite zur Visualisierung von Knuth Morris Pratt englisch Download auf SourceForge j Algo Programm zur anschaulichen VisualisierungEinzelnachweise Bearbeiten Pratt Morris A linear pattern matching algorithm Technical Report University of California Berkeley Computation Center TR 40 Knuth Morris Pratt Fast Pattern Matching in Strings SIAM Journal of Computing Band 6 1974 S 323 350 Abgerufen von https de wikipedia org w index php title Knuth Morris Pratt Algorithmus amp oldid 237914401