No estoy seguro si esto es la respuesta correcta, pero de todos modos:
Mientras que la construcción de el valor hash, se puede comprobar si hay una coincidencia en el conjunto de hashes de cuerda. Aka, el valor actual de hash. La función/código hash generalmente se implementa como un bucle y dentro de ese bucle podemos insertar nuestra búsqueda rápida. Por supuesto, debemos elegir m
para tener la longitud de cadena máxima del conjunto de cadenas.
Actualización: De 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
[...]
Calculamos actual de hash en m
pasos. En cada paso hay un valor de hash temporal que podemos buscar (complejidad O (1)) en el conjunto de hashes. Todos los hash tendrán el mismo tamaño, es decir, 32 bit.
Actualización 2: un amortizado (promedio) O (n) tiempo de la complejidad?
Arriba he dicho que m
debe tener la longitud máxima de la cadena. Resulta que podemos explotar todo lo contrario.
Con hashing for shifting substring search y un tamaño fijo m
podemos lograr O (n) complejidad.
Si tenemos cadenas de longitud variable, podemos establecer m
con la longitud mínima de la cadena. Además, en el conjunto de hash no asociamos un hash con toda la cadena, sino con los primeros m caracteres.
Ahora, mientras buscamos en el texto comprobamos si el hash actual está en el conjunto de hash y examinamos las cadenas asociadas para una coincidencia.
Esta técnica aumentará las falsas alarmas, pero en promedio tiene una complejidad de tiempo O (n).
No es la respuesta exacta, ya que sólo se ocupa de la búsqueda de una cuerda a la vez, no es múltiple, pero hay información posiblemente útil (bajo el encabezado 'Karp Rabin') que puede ayudarlo en: http://www-igm.univ-mlv.fr/~lecroq/string/index.html –
La wikipedia el artículo afirma que puede encontrar múltiples patrones en el tiempo O (n). – MAK