Ich bin mir nicht sicher, ob dies die richtige Antwort ist, aber trotzdem:
Während den Hash-Wert konstruieren, können wir für eine Übereinstimmung in dem Satz von String-Hashes überprüfen. Aka, der aktuelle Hash-Wert. Die Hash-Funktion/Code wird normalerweise als eine Schleife implementiert und innerhalb dieser Schleife können wir unsere schnelle Suche einfügen.
Natürlich müssen wir m
auswählen, um die maximale Stringlänge aus der Menge der Strings zu haben.
Update: aus Wikipedia,
[...]
for i from 1 to n-m+1
if hs ∈ hsubs
if s[i..i+m-1] = a substring with hash hs
return i
hs := hash(s[i+1..i+m]) // <---- calculating current hash
[...]
Wir berechnen aktuellen Hash in m
Schritten. Für jeden Schritt gibt es einen temporären Hash-Wert, den wir in der Menge der Hashes nachschlagen können (O (1) -Komplexität). Alle Hashes haben die gleiche Größe, dh 32 Bit.
Update 2: eine abgeschrieben (Durchschnitt) O (n) Zeit Komplexität?
Oben habe ich gesagt, dass m
die maximale Stringlänge haben muss. Es stellt sich heraus, dass wir das Gegenteil ausnutzen können.
Mit hashing for shifting substring search und einer festen m
Größe können wir O (n) Komplexität erreichen.
Wenn wir Strings variabler Länge haben, können wir m
auf die minimale Stringlänge setzen. Außerdem ordnen wir in der Menge der Hashes keinen Hash mit der gesamten Zeichenfolge zu, sondern mit den ersten m-Zeichen davon.
Jetzt, während wir den Text suchen, überprüfen wir, ob der aktuelle Hash im Hash-Set ist und untersuchen die zugehörigen Zeichenfolgen für eine Übereinstimmung.
Diese Technik erhöht die Fehlalarme, hat aber im Durchschnitt eine (n) Zeitkomplexität.
Es ist nicht die genaue Antwort, da sie nur mit der Suche nach einer Zeichenfolge zu einer Zeit beschäftigt, nicht mehrere, aber es gibt möglicherweise nützliche Informationen (unter der Überschrift "Karp Rabin"), die Ihnen helfen können: http://www-igm.univ-mlv.fr/~lecroq/string/index.html –
Die Wikipedia Artikel behauptet, es kann mehrere Muster in O (n) Zeit finden. – MAK