Académique Documents
Professionnel Documents
Culture Documents
Ejemplo:
Entrada: P=cc T=abcccbcc
Salida: 3, 4, 7
Pues P=cc ocurre en las posiciones 3, 4 y 7 de T=abcccbcc.
O bien,
Salida: 4, 5, 8
Pues P=cc ocurre en las posiciones finales 4, 5 y 8 de T.
A diferencia del algoritmo de fuerza bruta que compara P con un primer pedazo de
T -de izquierda a derecha-, luego avanza P (shift P) una posicin, vuelve a
comparar, etc.:
abcccbcc abcccbcc
ccc ccc
T a b c e r d g d r e f r e
P e g t d h d r
Ntese que si avanzamos P una posicin, la 'g' tampoco coincidir con 'd'.
Si avanzamos dos posiciones, la 'g' tampoco coincidir con 't':
Si hay una 'g' en P, es mejor desplazar P hasta que coincida con la 'g' de T.
Est claro que la 'g' que buscamos en P debe estar a la izquierda de la posicin
donde est el "mal" carcter g de T.
Ejemplo:
Reduciremos el alfabeto a {a,b,c,d,e,f,g,h,r,t}
P = egtdhdg
R[a] R[b] R[c] R[d] R[e] R[f] R[g] R[h] R[r] R[t]
0 0 0 6 1 0 7 5 0 3
Ntese que un algoritmo que construya estos valores lo puede hacer recorriendo P
una sola vez en O(n):
Para i=1 hasta n
R[P[i]] = i;
FinPara
R[a] R[b] R[c] R[d] R[e] R[f] R[g] R[h] R[r] R[t]
0 0 0 6 1 0 7 5 0 3
Nigel Horspool se dio cuenta que en vez de utilizar como el mal carcter, el
carcter de T que hace que las comparaciones fallen:
T = pastbdtubaevqxrshhhhhhxzzzzzhhh
P = actbdrxdae
En este caso el smbolo b es el "mal carcter".
R[a] R[b] R[c] R[d] R[e] R[f] R[g] R[h] R[r] R[t]
0 0 0 6 1 0 2 5 0 3
El algoritmo Boyer-Moore-Sunday (BMHS o BMS)
D. M. Sunday tiene una idea semejante, pero en vez de usar el carcter (de T) que
est junto al ltimo carcter de P (a la derecha), sugiere utilizar el carcter (de T)
que est inmediatamente despus.
En este caso R se calcula como en el algoritmo original sin obviar ningn smbolo.
Por ejemplo:
T= pastbdtubaevqxrsxxxxxxxhhhhh
P= actbdrxdae
En este caso el smbolo "v" es el "mal carcter".
Las ideas de Sunday y Horspool no son una inspiracin arbitraria sino que
fundamentan y acompaan sus ideas con datos empricos que muestran su vala,
como puede leerse en sus artculos originales.
Ejemplo muy popular (pero sesgado) donde se ve en la ltima lnea los saltos que
haran estos tres algoritmos: