Präfix-Funktion, Z-Funktion


Um dies zu erreichen, wird eine normale Übernahme nicht möglich sein, da die Asymptomie eine Asymmetrie sein wird. O(t*s). Der Algorithmus der Kommission ' s (Knuta-Morrisa-Pratta) wird daher zur Unterkonstruktionssuche verwendet.
Dieser Algorithmus verwendet die Prefix-Funktion der Zeile, es ist eine Menge Chips lang. n(Länge der Linie Sin dem jedes Element die größte Länge der hauseigenen Souffix des Unterbaus ist Smit ihrem Präfix. Zum Beispiel:
StrengePräfix FunktionAnmerkung
Ababababab0 0 1 2 3 4 0 1 2
Abcabc0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Aabaaab0 1 0 1 2 3

Trivial-Algorithmus der Präfix-Funktion mit der Asymptomie O(n^3):

HTML generiert mit Hilite. ich
Vektor/ination prefix_function (string s) {
in n = (seufzt)ins.length();
Vektor/ination Pi (n)
für (seufzt)in I= 0, i/n ++(i)
für (seufzt)in k.= 0, k:i) ++(k)
wenn (s.substr(s)0),k) == sync, berichtigt von elderman == s.substr(i)k.+ 1(k)
Pi[i] = k;
zurück Pi;
♪

Jetzt müssen wir einen präfix-funk für eine Artlinie machen: t + Swo # ein Streusymbol ist, das definitiv nicht im Text ist. Eine Analyse der Vorfix-Funktionswerte nach dem entsprechenden Teilersymbol zeigt an, dass, wenn der erhaltene Wert gleich der Länge der Unterstruktur ist, gefunden wird. Beispielsweise für die Bababcab-Linie und den Bababababab im Aufbau wird die Präfix-Funktion sein:
0 1 2 0 1 2 3 4 0 1 2 wird die ersten 5 Elemente abweisen, da wir eine Analyse der Elemente der entsprechenden Zeile s haben:
1 2 3 4 3 4 0 1 2 - es gibt zwei Fälle, in denen der Wert 4 (vier und sechste) beträgt, d.h. Länge t, aufgrund der Antwort, 4 - 4( Länge t) = 0 und 6 - 4 = 2. Es ist offensichtlich, dass dies die richtigen Antworten ist und die babab-Linie tatsächlich eine Unterzeile in der babcab-Linie in 0 und 2 ist.

Durch Optimierung der Vorfix-Funktion (Einzelheiten) Hier. Wir bekommen den letzten Algorithmus mit O(n):

HTML generiert mit Hilite. ich
Vektor/ination prefix_function (string s) {
in n = (seufzt)ins.length();
Vektor/ination Pi (n)
für (seufzt)in I= 1, i/n ++(i)
in J = Pi[i]-1;
während (j) ation 0) " S[i] ! = S[j]
J = Pi[j]-1;
wenn (s[i] == sync, berichtigt von elderman == S[j] ++j;
Pi[i] = j;
♪
zurück Pi;
♪

Z- Funktion
Z- Funktion von der Linie S - eine Masse Zjedes Element, dessen Z[i] ist das längste Vorfix des Unterbaus ausgehend von der Position i in Zeile Sdie gleichzeitig eine Vorstigung der gesamten Leitung ist Z~ Importance ~ Z- Brunnen in einer Nullstellung in der Regel gleich oder Null, oder die Länge der gesamten Linie.
Komplexität
O(|S| ^ 2) oder O(|S|)
Vorfix-Funktion aus der Linie S - eine Masse Pjedes Element, dessen P[i] ist das längste Soufffix des Unterbaus ausgehend von der Position i in Zeile Sdie gleichzeitig ein Souffix der ganzen Linie ist S~ Importance ~ P- Funktionen. in einer Nullstellung üblicherweise gleich Null oder die Länge der gesamten Linie.
Komplexität
O(|S| ^ 2) oder O(|S|)
Versuchen Sie, es passieren zu lassen. Z-функцию und Vorfix-Funktionfür O(|S| ^ 2)

Sowohl Z- als auch Präfixierungsfunktionen können zur Implementierung des ILC-Algorithmus (Knuta-Morrisa-Pratta) verwendet werden, der zur Suche nach einer Subzeile für O(киSки) ausgelegt ist. Das Wesen dieses Algorithmus ist, dass wir an die Linie schreiben, die wir finden möchten, die Linie, wo die Suche im Gange ist. Es ist sehr wünschenswert, dass zwischen diesen Zeilen ein separates Symbol gesetzt wird, d.h. ein Symbol, das in keiner Zeile gefunden wird (in der Regel #).