- String-Matching-Algorithmus
-
Dieser Artikel wurde aufgrund von inhaltlichen Mängeln auf der Qualitätssicherungsseite der Redaktion Informatik eingetragen. Dies geschieht, um die Qualität der Artikel aus dem Themengebiet Informatik auf ein akzeptables Niveau zu bringen. Hilf mit, die inhaltlichen Mängel dieses Artikels zu beseitigen und beteilige dich an der Diskussion! (+)
Begründung: Hat seit 2005 Allgemeinen Überarbeitenbaustein. Einleitungssatz mit 8 Kommata ist nicht gerade verständlich.--Flegmon 20:05, 11. Mai 2011 (CEST)In der Informatik sind String-Matching-Algorithmen eine Gruppe von Algorithmen, die das Finden von Textsegmenten in einer Zeichenkette (engl. string) anhand eines vorgegebenen Suchmusters beschreiben. Sie zählen somit zur Klasse der Zeichenkettenalgorithmen.
Im engeren Sinne suchen diese Algorithmen nach exakten Übereinstimmungen (engl. matches). Im weiteren Sinne sind auch Algorithmen gemeint, die ungefähre Übereinstimmungen zulassen, wobei der Begriff ungefähr durch ein Toleranzkriterium genau definiert sein muss.
Das Problem besteht darin, diese Aufgabe möglichst effizient zu lösen. In der Praxis ist dies bedeutsam, wenn in großen Textmengen (wie z. B. Wikipedia) Suchbegriffe gefunden werden sollen.
Inhaltsverzeichnis
Exakte Suche
Problemstellung
Grundsätzlich sind zwei Situationen zu unterscheiden:
- Nach Vorgabe einer Suchmaske sollen beliebige Texte durchsucht werden.
- Der Text ist vorgegeben, und dann sollen beliebige Suchmasken im Text gefunden werden.
Der zweite Fall entspricht etwa der Aufgabe, die Wikipedia derart aufzubereiten, dass beliebige Suchmasken schnell und effizient aufgefunden werden. Auch Suchmaschinen im Internet finden sich in der zweiten Situation.
Im Folgenden wird jedoch nur auf die erste Situation eingegangen.
Lösungsmethoden
Naiver Algorithmus
Der einfachste Algorithmus besteht darin, ein so genanntes Suchfenster von der Länge der Suchmaske über den Text zu schieben. In jeder Position der Suchmaske werden die Symbole der Maske mit denen des darunterliegenden Textes verglichen. Wenn ein nichtübereinstimmendes Symbol gefunden wird, wird das Fenster um eine Position verschoben, und erneut ein Vergleich angestellt; wenn alle Symbole im Fenster übereinstimmen, ist die Suchmaske gefunden worden. Der Algorithmus endet, wenn der ganze Text vom Fenster abgesucht worden ist.
Dieser Algorithmus hat eine Laufzeit von der Ordnung O=n·m, wenn m die Länge der Suchmaske und n die Länge des Textes ist.
Pseudocode:
Eingabe: Strings T = T1... Tn und P = P1 ... Pm Ausgabe: q die Stellen an denen P in T auftritt
For q = 0 to n − m do If P1 = Tq+1 and P2 = Tq+2 and ... and Pm = Tq+m: Print q
Überraschenderweise ist der naive Ansatz in der Praxis sehr schnell, da Fehler in natürlichsprachigen Texten nach 1 bis 2 Zeichen auftauchen. Für die englische Sprache ergibt sich eine Wahrscheinlichkeit von 1.07 Zeichen. Somit ist der naive Ansatz nahezu linear schnell.
Dies wird auch deutlich wenn man sich den ungünstigsten Fall selbst ansieht. Er lautet
Text: aaa...aab Muster: ab
Derartige Fälle sind in natürlich sprachlichen Texten äußerst unwahrscheinlich.
Der Knuth-Morris-Pratt-Algorithmus
Der Knuth-Morris-Pratt-Algorithmus baut auf dem naiven Suchalgorithmus auf. Wesentlicher Unterschied ist, dass das Vergleichsfenster nicht immer um nur eine Position weitergerückt wird, sondern eventuell um mehr als eine Position.
Dazu muss zu Anfang die Suchmaske analysiert werden, so dass bei jeder teilweisen Übereinstimmung, etwa der ersten k Symbole, bekannt ist, ob der Anfang der Suchmaske mit dem Ende der letzten übereinstimmenden Teilmaske übereinstimmt. Die Verschiebung der Suchmaske erfolgt nach der überlappenden Übereinstimmung; zusätzlicher Vorteil ist, dass die schon verglichenen Symbole nicht noch einmal verglichen werden müssen.
Suche im Suffixbaum
Insbesondere, wenn der zu durchsuchende Text im voraus bekannt ist, und in diesem später nach vielen unterschiedlichen Mustern gesucht werden soll, bietet sich die Konstruktion eines Suffixbaums an. Diese Konstruktion kann in O(n) erfolgen. Anschließend kann jedes Muster ohne erneute Vorbereitung des Texts in O(m) gesucht werden: Sofern es vorhanden ist, kann man von der Quelle des Suffixbaums den entsprechenden Knoten erreichen, ansonsten schlägt die Suche fehl (es ist kein entsprechender Knoten vorhanden).[1]
Übersicht
Vorbereitungszeit Suchzeit Naiver Algorithmus 0 (keine) Θ(n·m) Rabin-Karp-Algorithmus Θ(m) average Θ(n+m),
worst Θ(n·m)Endlicher Automat O(m |Σ|) Θ(n) Knuth-Morris-Pratt-Algorithmus Θ(m) Θ(n) Boyer-Moore-Algorithmus[2] Θ(m) average Θ(n/m),
worst Θ(n)Shift-Or-Algorithmus (Bitap Algorithmus, Baeza-Yates-Gonnet) Θ(m+|Σ|) Θ(n) Suche im Suffixbaum Θ(n) Θ(m) Wobei m die Länge der Suchmaske und n die Länge des Textes ist.
Weitere Algorithmen
- Boyer-Moore-Algorithmus:
- Skip-Search-Algorithmus
- Baeza-Yates-Gonnet-Algorithmus („shift-or“)
- Soundex
- Kölner Phonetik
Mustervergleichssuche
Hauptartikel: Pattern Matching
Die Suche nach Mustern ist zwischen unscharfer und exakter Suche anzusiedeln, da der Benutzer explizit angeben muss, welchen Spielraum er für bestimmte Zeichenklassen an bestimmten String-Positionen zulässt.
Unscharfe Suche
Hauptartikel: unscharfe Suche, phonetische Suche
Bei der unscharfen Suche entscheidet üblicherweise der Algorithmus nach Vorgabe eines Güte- oder Abstandskriteriums, wie groß die Abweichung von Treffern gehen darf.
Siehe auch
- Suchverfahren
- Levenshtein-Distanz (approximative Suche)
- Volltextrecherche
Weblinks
- Java-Animationen, die die Funktionsweise so gut wie aller exakten Suchalgorithmen veranschaulichen
- StringSearch – high-performance pattern matching algorithms in Java – Implementierungen vieler String-Matching-Algorithmen in Java (BNDM, Boyer-Moore-Horspool, Boyer-Moore-Horspool-Raita, Shift-Or)
- einfache und ausführliche Erklärung des Boyer-Moore-Algorithmus
- Shift-And- (Shift-Or-)Algorithmus
Einzelnachweise
- ↑ Gusfield, Dan (1999 [1997]) Algorithms on Strings, Sequences and Trees. ISBN 0-521-58519-8. Kapitel 7.1.APL1.
- ↑ R. S. Boyer, J. S. Moore: A fast string searching algorithm. In: Comm. ACM. 20, 1977, S. 762–772. doi:10.1145/359842.359859.
Wikimedia Foundation.