Boyer-Moore es el algoritmo de string matching más rápido en la práctica: compara el patrón de derecha a izquierda y puede saltar múltiples posiciones en el texto tras un mismatch usando dos heurísticas.
Es especialmente efectivo cuando el patrón es largo o el alfabeto es grande, porque el O(n/m) caso promedio es muy rápido.
Cómo Funciona
Alinea patrón con texto desde posición i.
Compara patrón right-to-left desde j = m-1.
- Matching: mientras
text[i+j] == pat[j], decrementaj. - Match completo: si
j < 0, encontrado eni. - Mismatch en
j: calcula shift.- Bad character: si
text[i+j]no está en patrón, saltaj+1. Si está, saltaj - last_occurrence[text[i+j]]. - Good suffix: si hay suffix que coincide, salta según tabla.
- Bad character: si
- Shift:
i += max(bad_char_shift, good_suffix_shift).
Idea Clave
Right-to-left permite saltos grandes: si el primer carácter comparado (el más a la derecha del patrón) no coincide, puedes saltar todo el patrón si ese carácter no aparece en él.
Las dos heurísticas son independientes y se combinan tomando el máximo shift.
Ejemplo Trabajado
Patrón: EXAMPLE, texto: FINISH EXAMPLE CODE.
Alinea EXAMPLE con FINISH (primeras 7 chars).
- Compara right-to-left:
EvsH→ mismatch. - Bad character:
Hno está enEXAMPLE→ shift = 7 (salta todo el patrón).
Alinea con EXAMPLE en texto: match completo.
Casos Extremos y Trampas
- Patrón repetitivo —
AAAAAen textoAAAAAAAAA: worst case O(nm). - Alfabeto pequeño — si todas las letras aparecen en el patrón, bad character hace saltos pequeños.
- Good suffix — complementa bad character cuando el carácter sí aparece pero el suffix coincide.
- Horspool — simplificación que solo usa bad character; más simple, casi igual de rápido.
Comparación
| Algoritmo | Dirección | Complejidad promedio | Complejidad worst |
|---|---|---|---|
| Naive | Left-to-right | O(nm) | O(nm) |
| KMP | Left-to-right | O(n+m) | O(n+m) |
| Boyer-Moore | Right-to-left | O(n) | O(nm) |
| Horspool | Right-to-left | O(n) | O(nm) |
Aplicaciones
- Editores de texto — grep, find/replace
- Detección de virus — escaneo rápido de firmas
- Detección de plagio — búsqueda eficiente en corpus grandes
- Enseñanza — introduce heurísticas y right-to-left matching
Trayectoria de Práctica
- Investiga Horspool (solo bad character); implementa y prueba.
- Investiga Boyer-Moore completo con good suffix.
- Compara con KMP en texto aleatorio vs texto repetitivo.
- ¿Por qué right-to-left es más rápido en promedio?
- Investiga Apostolico-Giancarlo: ¿cómo mejora good suffix?