Nie jestem pewien, czy to jest poprawna odpowiedź, ale tak czy owak:
Podczas konstruowania wartość hash, możemy sprawdzić na mecz w zestawie skrótów smyczkowych. Wartość mieszania Aka, bieżącego. Funkcja/kod skrótu jest zwykle zaimplementowana jako pętla, a wewnątrz tej pętli możemy wstawić naszą szybką wyszukiwarkę.
Oczywiście, musimy wybrać m
, aby uzyskać maksymalną długość ciągu ze zbioru ciągów.
Aktualizacja: Z Wikipedii,
[...]
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
[...]
Obliczamy aktualny hash w m
krokach. Na każdym kroku znajduje się wartość mieszania, którą możemy sprawdzić (złożoność O (1)) w zestawie skrótów. Wszystkie skróty będą miały ten sam rozmiar, tj. 32-bitowy.
Aktualizacja 2: zamortyzowany (średnia) O (n) Złożoność?
Powyżej powiedziałem, że m
musi mieć maksymalną długość ciągu. Okazuje się, że możemy wykorzystać przeciwieństwo.
Z hashing for shifting substring search i stałym rozmiarem m
możemy uzyskać złożoność O (n).
Jeśli posiadamy łańcuchy o zmiennej długości, możemy ustawić m
na minimalną długość ciągu znaków. Dodatkowo w zestawie skrótów nie łączymy hasha z całym ciągiem znaków, ale z pierwszymi znakami m temu.
Teraz podczas przeszukiwania tekstu sprawdzamy, czy aktualny hash znajduje się w zestawie skrótów i sprawdzamy powiązane łańcuchy dla dopasowania.
Ta technika zwiększy liczbę fałszywych alarmów, ale średnio ma złożoność O (n).
To nie jest dokładna odpowiedź, ponieważ dotyczy jedynie poszukiwania jednej strunie naraz, nie wiele, ale jest kilka użytecznych informacji (pod nagłówkiem "Karp Rabin"), które mogą ci pomóc: http://www-igm.univ-mlv.fr/~lecroq/string/index.html –
The wikipedia Artykuł twierdzi, że może znaleźć wiele wzorców w czasie O (n). – MAK