GEHNIO |
|
> Home > Algorithmen > Datenstrukturen > Maschinenmodelle > Probleme > Themen > Mindmaps > Aufgaben > Facharbeit > Abitur > Projekte > Informatik-AG > News > Impressum |
Beim Suchen von W�rtern in Texten unterscheidet man zwischen zwei verschiedenen Arten
von Texten. Sogenannte statische Texte sind Texte, die sich nur sehr selten und
geringf�gig ver�ndern. Bei solchen Texten ist es sinnvoll, ein Verfahren zu
entwickeln, mit dem eine schnelle Suche nach W�rtern im Text m�glich ist.
Bei einem W�rterbuch zum Beispiel ist es �blich, dieses in Abschnitte A..Z zu
unterteilen und die Stichworte alphabetisch anzuordnen. In einem derart
aufbereiteten Text ist die Suche einfach und kann entsprechend schnell
durchgef�hrt werden. Beim String Matching ist man daran interessiert, das
Muster P im Text T zu finden, bzw. die Anzahl der Zeichen anzugeben, um
die das Muster über dem Text verschoben werden muss, um mit der
gleichen Zeichenkette im Text deckungsgleich zu sein. Bei dieser
Verschiebung spricht man von einem shift
. Betrachten wir einmal folgendes Beispiel: 3 5 8 1 2 3 4 5 8 2 5 6 9 1 2 kommt die Zeichenkette 1 2 3 4 5 mit einem shift von 3 vor. Ein naiver Algorithmus
Sehr hilfreich ist es, wenn wir das
Problem, ob zwei Zeichenketten gleich sind zunächst gesondert betrachten.
Die folgende einfache Funktion ermöglicht den Vergleich zweier
Zeichenketten A[1..m] und B[1..m]: function
test(array A[1..m], array B[1..m]):returns boolean
function test(int s):returns boolean
algorithmus
string_matching Natürlich sucht man für das String Matching Problem schnellere Algorithmen. Im Folgenden sollen einige Ansätze dazu vorgestellt werden. Der Rabin-Karp-Algorithmus - Matching mit Fingerprint Grundlegende Idee dieses Algorithmus ist es, nicht das Muster P selbst (zeichenweise) mit dem Text zu vergleichen, sondern statt dessen eine wesentlich kleinere Information, gewissermaßen den Fingerabdruck (engl. fingerprint) des Musters mit dem Text zu vergleichen. Der Finderabdruck des Musters wird mittels einer Funktion berechnet, die als Hashfunktion bezeichnet wird. Die Hashfunktion soll das Muster auf einen Fingerabdruck abbilden, der so klein ist, dass seine Information in einer Speicherstelle gespeichert werden kann, also mit einer Komplexität von O(1) verarbeitet werden kann. Der Algorithmus vergleicht also den Fingerabdruck des Musters mit dem Hashfunktionswert von entsprechenden Textabschnitten. Stimmen die Hashwerte von Muster und Textabschnitt nicht überein, so kann sofort weitergeschoben werden, ansonsten muss ein Vergleich zeigen, dass tatsächlich Gleichkeit bei Muster und Textabschnitt besteht. Der tatsächliche Vergleich ist in diesem Fall notwendig, da es sein kann, dass die Hashfunktion auch ungleiche Zeichenketten auf den gleichen Hashwert abbilden kann. Wichtig ist es, dass die Berechnung des Hashwertes einer Zeichenkette in O(1) geschehen kann. Dies ist möglich, wenn man eine Hashfunktion nach der Kongruenzmethode (modulo q) einsetzt.
Betrachten wir das obige Beispiel mit
einem Alphabet h' = ( ( h - 1* u)* |A| + 7) wobei u = 10 m-1 modulo q und |A| = Anzahl der Zeichen im Alphabet A sind. Alle Berechnungen werden dabei modulo q durchgeführt. q sei dabei eine Primzahl, wobei q größer als die Musterlänge von m sein sollte. algorithmus Rabin_Karp
|
� 2002 Gesamtschule Duisburg-Hamborn/Neumühl. |