Rabin-Karp es un algoritmo de string matching basado en rolling hash: calcula hashes del texto en una sliding window y compara con el hash del patrón. Si los hashes coinciden, verifica carácter por carácter para confirmar.
Es especialmente útil para múltiples patrones o detección de plagio (comparar todos los substrings de longitud m).
Cómo Funciona
- Calcula hash del patrón:
hash_pat = Σ pat[i] × base^{m-1-i} mod mod. - Calcula hash de la primera ventana del texto:
hash_windowparatext[0..m-1]. - Rolling: para cada posición
ide 1 an-m:hash_window = (hash_window - text[i-1] × base^{m-1}) × base + text[i+m-1] mod mod- Si
hash_window == hash_pat: verifica carácter por carácter.
- Si verificación pasa: match encontrado.
Idea Clave
El rolling hash permite actualizar el hash de la ventana en O(1): eliminas el carácter más viejo (multiplicado por base^{m-1}), multiplicas el resto por base, y añades el nuevo carácter.
Colisiones son posibles (dos strings distintas con el mismo hash), por lo que siempre necesitas verificación lineal tras una coincidencia de hash.
Ejemplo Trabajado
Patrón: ABC, texto: ABABC.
Elige base = 256, mod = 101.
Hash del patrón ABC:
hash('A') = 65
hash('B') = 66
hash('C') = 67
hash_pat = (65 × 256² + 66 × 256¹ + 67) mod 101
Ventana 1 ABA (índices 0-2): calcula hash y compara.
Rolling a ventana 2 BAB (índices 1-3): actualiza hash.
Rolling a ventana 3 ABC (índices 2-4): actualiza hash → coincide → verifica → match.
Casos Extremos y Trampas
- Colisiones — con
modpequeño, colisiones son frecuentes. Usamodgrande (10⁹+7) o doble hash. - Overflow — usa
modpara evitar overflow en lenguajes con enteros limitados. - Patrón vacío — indefinido; retorna 0 o error.
- Múltiples patrones — calcula hash para cada patrón, usa hash set para lookup O(1).
Comparación
| Algoritmo | Tiempo promedio | Backtrack texto | Múltiples patrones |
|---|---|---|---|
| Naive | O(nm) | Sí | No |
| KMP | O(n+m) | No | No |
| Rabin-Karp | O(n+m) | No | Sí (hash set) |
| Boyer-Moore | O(n/m) | No | No |
Aplicaciones
- Detección de plagio — busca todos los substrings de longitud
men un corpus - Búsqueda en documentos — encuentra múltiples palabras clave
- Bioinformática — búsqueda de secuencias en genomas grandes
- Enseñanza — introduce rolling hash y probabilidad de colisión
Trayectoria de Práctica
- Implementa rolling hash con base=256, mod=101; traza el ejemplo.
- Añade verificación carácter por carácter tras coincidencia de hash.
- Investiga double hashing: ¿cómo reduce colisiones?
- Extiende a múltiples patrones: almacena hashes en un set.
- Investiga Rabin-Karp para 2D pattern matching en imágenes.