¿Cómo funciona la función Rolling Hash utilizada en el algoritmo Rabin Karp?

Considere que hay una Cadena S de tamaño k + 1 de c1 … ck + 1

El hash (H1) sobre k caracteres (c1..ck) podría calcularse de la siguiente manera:
H1 = c1 * a ^ k-1 + c2 * a ^ k-2 + c3 * a ^ k-3 +… + ck * a ^ 0
donde a es una constante
y c1 … ck son caracteres de entrada.

Supongamos que desea calcular el hash (H2) sobre la misma ventana de tamaño k sobre caracteres (c2..ck + 1) podría calcularse a partir de una lógica similar de la siguiente manera:
H2 = c2 * a ^ k-1 + c3 * a ^ k-2 +… + ck + 1 * a ^ 0
donde a es una constante
y c2..ck + 1 son caracteres de entrada.

Ahora, si miramos cuidadosamente, H2 = [H1 * a] + [ck + 1 * a ^ 0 (es decir, el último término de esta ventana)] – [c1 * a ^ k-1 (es decir, primer término de H1)]

Entonces, en efecto, cada vez que estamos calculando hash rodante, no tenemos que calcular completamente el hash. Podemos aprovechar el hash previamente calculado y luego se trata de multiplicar por a, restando el primer término del último hash y agregando el último carácter de la siguiente ventana.

Del mismo modo, cada vez que calcula funciones hash rodantes en las que desplaza la ventana hacia la derecha o hacia la izquierda no implica calcular toda la función hash, sino que requiere multiplicación o división por constante y resta / suma del último / primer término.

Espero que esto ayude.

Mi respuesta La respuesta de Pawan Bhadauria a ¿Qué es un hash rodante y cuándo es útil? debería ayudar

More Interesting

¿Cómo funcionan los algoritmos de Google en los motores de búsqueda?

¿Cómo encontramos la altura de un árbol binario? ¿Cómo se relaciona con el nivel?

¿Cómo se puede desarrollar la lógica en la programación?

¿Qué algoritmos de minería de datos puedo usar para maximizar las ganancias de una compañía de tarjetas de regalo que almacena ventas, pedidos y datos de clientes en una base de datos relacional?

¿Cuáles son las ventajas de las pilas en la estructura de datos?

¿Por qué el método Arrays.sort en Java implementa timsort en lugar de contar?

¿Es correcto mi nuevo estado de ánimo? Ingresé a la programación desde un punto de vista de programación algorítmica y, como tal, tengo una inclinación a querer saber cómo funcionan las cosas debajo. Pero ahora, después de un tiempo en el mundo de los desarrolladores, finalmente tengo que darme cuenta de que se trata menos de eso. ¿Lo que usted dice?

¿Cómo funciona un algoritmo de bogosort cuántico?

¿Qué algoritmo de ML debo usar para una aplicación de selección de automóviles basada en Tinder?

¿Por qué la recursión me causa tantos problemas?

¿Cuáles son los 10 algoritmos y estructuras de datos imprescindibles para un concurso de programación?

¿Cuál es la explicación intuitiva para agregar flujo en bordes inversos en el algoritmo de flujo máximo? ¿Por qué necesitamos eso?

¿Por qué en Java, la memoria es liberada por el algoritmo Mark y Sweep y no por ningún otro algoritmo?

¿Cómo se resolvería el problema lingüístico 'Summer Eyes', de NACLO 2009?

¿De dónde obtienen los algoritmos comerciales sus datos sin procesar?