Zum Hauptinhalt springen

Der Trabba-Prado-Peitsche-Algorithmus im C-Code: Beispiele und Erklärung

Der Trabba-Prado-Peitsche-Algorithmus (TPK) ist eine effektive Methode, um eine Teilzeichenfolge in einer Zeichenfolge zu finden, die 1975 entwickelt wurde. Es basiert auf einer Kombination von Boyer-Moore- und Knut-Morris-Pratt-Algorithmen. TPK kann verwendet werden, um eine oder mehrere Teilzeichenfolgen in großem Text zu finden, und seine Anwendung ist in der Programmierung und Informationstechnologie weit verbreitet.

Der Hauptvorteil von TPK ist, dass es eine Ausführungszeit von O(n+m) hat, wobei n die Länge des Textes und m die Länge des Teilstrings ist. Dies macht den Algorithmus sehr effizient, selbst in sehr großen Textdateien zu suchen. Außerdem erfordert ein TPK keine Tabellenerstellung oder Vorverarbeitung, sodass es leicht in C-Code implementiert werden kann.

Ein wichtiger Schritt von TPK besteht darin, eine Offset-Tabelle zu erstellen, die bestimmt, wie weit Sie verschieben können, wenn ein Zeichenkonflikt in der Teilzeichenfolge erkannt wird. Der Algorithmus beginnt dann mit der Suche am Ende der Teilzeichenfolge und verschiebt sie nach rechts, bis alle Zeichen übereinstimmen. Wenn eine Diskrepanz auftritt, verwendet sie die Offset-Tabelle, um die korrekte Verschiebung zu bestimmen, und sucht weiter, bis die Teilzeichenfolge gefunden wird oder der gesamte Text angezeigt wird.

Beispielcode in C-Sprache, der den Trabba-Prado-Peitsche-Algorithmus implementiert:

Was ist der Trabba-Prado-Peitsche-Algorithmus?

Die Grundidee des TPK-Algorithmus besteht darin, einen Teilstring dynamisch mit Text zu vergleichen. Anstatt die Präfixfunktion für die gesamte Zeichenfolge vorab zu berechnen, erstellt und verwendet der TPK-Algorithmus eine Präfixfunktion für jede endgültige Position der Teilzeichenfolge in der Zeichenfolge.

Der Algorithmus besteht aus zwei Hauptschritten. Der erste Schritt besteht darin, eine Präfixfunktion für eine Teilzeichenfolge zu erstellen, der zweite Schritt besteht darin, die Teilzeichenfolge mit Text unter Verwendung der konstruierten Präfixfunktion zu vergleichen.

Der TPK-Algorithmus ist effizient und hat eine lineare Komplexität, um alle Vorkommen einer Teilzeichenfolge in einer Zeichenfolge zu finden. Es benötigt auch keinen zusätzlichen Speicher, außer dem, der zum Speichern der ursprünglichen Zeichenfolge und der Teilzeichenfolge benötigt wird.

Beispiele für die Verwendung des Trabba-Prado-Peitsche-Algorithmus

Hier sind einige Beispiele für die Verwendung des Trabba-Prado-Peitsche-Algorithmus:

Beispiel 1:

#include #include // Функция для выполнения алгоритма Трабба-Прадо-Кнутаvoid TPK(char *text, char *pattern)= 0; j--)if (j == -1)else>>

Beispiel 1 zeigt, wie der Trabba-Prado-Peitsche-Algorithmus verwendet wird, um nach einer Teilzeichenfolge in einer Zeichenfolge zu suchen. Der TPK-Funktionscode akzeptiert zwei Zeichenfolgen: text ist die Hauptzeichenfolge und pattern ist die zu suchende Teilzeichenfolge. Die Funktion durchläuft alle möglichen Positionen im text und vergleicht jedes Zeichen mit dem entsprechenden Zeichen im pattern . Wenn alle Zeichen übereinstimmen, wurde eine Teilzeichenfolge gefunden.

Beispiel 2:

#include #include // Функция для выполнения алгоритма Трабба-Прадо-Кнутаvoid TPK(char *text, char *pattern)= 0 && pattern[j] == text[s + j])j--;if (j == -1)else>>

Beispiel 2 stellt eine andere Implementierung des Trabba-Prado-Peitsche-Algorithmus dar. Diese Version verwendet eine while-Schleifenanweisung anstelle einer for-Schleife. Der Ansatz ähnelt dem ersten Beispiel: die TPK-Funktion durchläuft alle möglichen Positionen in text und vergleicht jedes Zeichen mit dem entsprechenden Zeichen in pattern .

Dies sind nur zwei Beispiele für die Verwendung des Trabba-Prado-Peitsche-Algorithmus, aber es gibt viele Möglichkeiten, diesen Algorithmus in verschiedenen Szenarien anzuwenden. Es ermöglicht das effiziente Finden von Teilstrings in Strings und ist eines der wichtigsten Werkzeuge in der Programmierung.

Beispiel 1: Suchen einer Teilzeichenfolge in einer Zeichenfolge

In diesem Beispiel werden wir uns ansehen, wie der Trabba-Prado-Peitsche-Algorithmus verwendet wird, um nach einer Teilzeichenfolge in einer Zeichenfolge zu suchen.

Nehmen wir an, wir haben die Zeichenfolge "abvgdeezhziklmnoprstufhtzschschjeiyuya" und wir wollen die Teilzeichenfolge "klmno" finden.

Lassen Sie uns Schritt für Schritt erklären, wie der Algorithmus funktioniert:

  1. Wir erstellen die Variablen i und j, die verwendet werden, um sich durch die Zeichenfolge zu bewegen.
  2. Wir setzen i auf 0 (Index des ersten Zeichens einer Zeichenfolge) und j auf 0 (Index des ersten Zeichens einer Teilzeichenfolge).
  3. Dann fangen wir an, Zeichenfolgen und Teilzeichenfolgen zu vergleichen:
    • Wenn die Zeichen übereinstimmen, erhöhen wir i und j um 1 und vergleichen weiterhin die folgenden Zeichen.
    • Wenn die Zeichen nicht übereinstimmen, verschieben wir i auf (j - T[j-1]) positionen nach rechts, wobei T[j-1] ist der Wert der Präfixfunktion für die Teilzeichenfolge. Dann vergleichen wir die Zeichen mit den neuen Werten i und j.
  4. Wir setzen diesen Vergleich fort, bis wir alle Vorkommen einer Teilzeichenfolge in einer Zeichenfolge gefunden haben.

Mit diesem Algorithmus können wir eine Teilzeichenfolge-Suchfunktion in einer Zeichenkette in C implementieren:

#include int KMPsearch(char* str, char* substr) else else >>// Используем алгоритм Трабба-Прадо-Кнута для поиска подстрокиi = 0, j = 0;while (i < n) if (j == m) else if (str[i] != substr[j]) >free(T);>int main()

Als Ergebnis der Ausführung dieses Codes erhalten wir Folgendes:

Подстрока найдена в позиции 17

Dies bedeutet, dass die Teilzeichenfolge "klmno" in der Zeichenfolge "abvgdeezhziklmnoprstufhtzschschtschjeiyuya" gefunden wurde und ihre Position in der Zeichenfolge 17 ist.

Beispiel 2: Sortieren eines Arrays von ganzen Zahlen

Betrachten wir ein Beispiel für das Sortieren eines Arrays von ganzen Zahlen mit dem Trabba-Prado-Peitsche-Algorithmus.

Angenommen, wir haben das folgende Array: [59218]. Um es in aufsteigender Reihenfolge zu sortieren, können wir den Trabba-Prado-Peitsche-Algorithmus wie folgt verwenden:

  1. Initialisieren Sie die Variable isSorted mit dem Wert 0.
  2. Erstellen Sie eine Schleife, die ausgeführt wird, bis isSorted auf 1 festgelegt ist.
  3. Innerhalb der Schleife gehen wir durch das gesamte Array und vergleichen jedes Paar benachbarter Elemente.
  4. Wenn das aktuelle Element größer ist als das nächste Element, tauschen wir sie aus.
  5. Nachdem Sie den Durchlauf durch das Array abgeschlossen haben, setzen Sie isSorted auf 1, wenn kein Elementpaar ausgetauscht wurde.

Am Ende werden alle Elemente nach mehreren Durchgängen durch das Array in aufsteigender Reihenfolge sortiert. Zum Beispiel unser Quellarray [59218] wird in konvertiert [12589].

Hier ist ein Beispielcode in C-Sprache, der den Trabba-Prado-Peitsche-Algorithmus implementiert, um ein Array von ganzen Zahlen zu sortieren:

Erwartetes Ergebnis der Codeausführung:

Sorted array: 1 2 5 8 9

Hoffentlich hat Ihnen dieses Beispiel geholfen, besser zu verstehen, wie Sie den Trabba-Prado-Peitsche-Algorithmus verwenden, um ein Array von ganzen Zahlen zu sortieren.

Erläuterung des Trab-Prado-Peitschenalgorithmus

Der TPI-Algorithmus verwendet zwei Tabellen: die Wertetabelle T (Trabba-Tabelle) und die Tabelle für zusätzliche Transformationen P (Prado-Tabelle). Die Trabba-Tabelle definiert die maximal möglichen Verschiebungen für jedes Zeichen, unabhängig vom vorherigen Zeichen, bei denen die Teilzeichenfolge mit der Hauptzeichenfolge verglichen werden soll. Die Prado-Tabelle enthält Informationen zu zusätzlichen Verschiebungen, die bei Nichtübereinstimmungen der Zeichen vorgenommen werden können.

Der TPI-Algorithmus arbeitet in einem sequentiellen Durchgang, um die ursprüngliche Zeichenfolge mit der gewünschten Teilzeichenfolge zu vergleichen. Der Algorithmus beginnt mit dem Vergleichen des ersten Zeichens beider Zeilen. Wenn Sie übereinstimmen, gehen Sie zum nächsten Zeichen über. Im Falle einer Nichtübereinstimmung in der Trabba-Tabelle suchen wir nach der gewünschten Verschiebung für das aktuelle Symbol und bewegen den Zeiger auf diese Position. Wenn das Symbol nicht gefunden wird, führen wir eine zusätzliche Verschiebung gemäß der Prado-Tabelle durch.

Der Suchvorgang wird fortgesetzt, bis das Vorkommen der Teilzeichenfolge gefunden wird oder das Ende der Zeichenfolge erreicht ist. Wenn ein Vorkommen gefunden wird, stoppt der Algorithmus und gibt den Index des Vorkommens zurück. Im Falle eines Fehlers gibt der Algorithmus -1 zurück, was bedeutet, dass keine Teilzeichenfolge in der Zeichenfolge gefunden wurde.

Der TPI-Algorithmus ist effizient und ermöglicht eine schnellere Suche nach Teilzeichenfolgen, insbesondere in Fällen, in denen die Hauptzeichenfolge doppelte Segmente enthält.

Schritt 1: Erstellen von Präfixfunktionen

Sie können den KMP-Algorithmus (Knut-Morris-Pratt) verwenden, um Präfixfunktionen zu erstellen. Es basiert auf der Verwendung von Informationen, die aus bereits gesammelten Zwischenpräfixfunktionen stammen, und vermeidet wiederholte Vergleiche, was die Effizienz des Algorithmus verbessert.

Der Prozess zum Erstellen von Präfixfunktionen beginnt mit dem einfachsten Fall: Die Präfixfunktion ist für die erste Position in der Zeile Null. Dann wird für jede Position i in der Zeile eine Präfixfunktion wie folgt berechnet:

Position iPrefix-Funktion
i = 00
i = 10
i = 20
i = 31
i = 42
i = 50
i = 61
i = 72

In diesem Beispiel werden die Präfixfunktionen für die Zeichenfolge "ABCDABD" ausgewertet. An jeder Position i wird der Wert der Präfixfunktion als die größte Länge des eigenen Präfixes definiert, das auch das Suffix für die Teilzeichenfolge ist, die an Position i endet.

Die Berechnung von Präfixfunktionen ist ein wichtiger Schritt für die erfolgreiche Implementierung des Trabba-Prado-Peitsche-Algorithmus. Nachdem sie erstellt wurden, können Sie beginnen, nach allen Vorkommen der Teilzeichenfolge in der angegebenen Zeichenfolge zu suchen.