You are on page 1of 5

Algoritmo de bsqueda y su eficiencia de cadena Knuth-Morris-Pratt.

Por: Jos Avendao, Jonathan Muoz y Kendall Kant

Qu es?
Es un algoritmo de bsqueda de subcadenas simple y por lo tanto su objetivo es
buscar la existencia de una subcadena dentro de una cadena. Para ello utiliza
informacin basada en los fallos previos, aprovechando la informacin que la propia
palabra a buscar contiene de s (sobre ella se precalcula una tabla de valores), para
determinar donde podra darse la siguiente existencia, sin necesidad de analizar
ms de 1 vez los caracteres de la cadena donde se busca.

Historia:
El algoritmo de bsqueda de cadenas Knuth-Morris-Pratt (KMP) busca la aparicin
de una palabra P dentro de una cadena de texto principal C.
Inventado por Knuth y Pratt e independientemente por J. H. Morris en 1977, pero
los tres lo publicaron en conjunto.

Descripcin del Algoritmo KMP:


El algoritmo KMP, trata de localizar la posicin de comienzo de una cadena,
dentro de otra. Antes que nada con la cadena a localizar se precalcula una tabla
de saltos (conocida como tabla de fallos) que despus al examinar entre si las
cadenas se utiliza para hacer saltos cuando se localiza un fallo.

Dnde se aplica el algoritmo KMP?


Medicina: Bsqueda de cadena de aminocidos en las cadenas de
protenas.
Programacin:
En los antivirus, bsqueda de cadena de caracteres de la firma de
algn virus.
En administracin de un chat interno de una empresa (buscar malas
palabras).
Algoritmo de bsqueda de KMP:
Pseudocdigo

Algoritmo BsquedaKMP:
Entrada:
un array de caracteres, T (el texto donde se busca)
un array de caracteres, P (la palabra/s que se busca)
Salida:
un entero que expresa la posicin en T en la cual se encontr P.
(nota: opcionalmente puede convenir devolver un entero con
signo).

Definicin de variables:
un entero, k 0 (puntero de examen en T)
un entero, i 0 (la posicin del carcter actual en P, y avance
relativo respecto de k, para T)
un array de enteros, F (la tabla de fallo, calculada a
continuacin, o en otra parte)
Si tamao de T es mayor o igual que tamao de P entonces
Precalcular TablaKMP(P,F)
Mientras k + i es menor que la longitud de T, hacer
Si P[i] = T[k + i] entonces
Si i es igual a la longitud de P - 1 entonces
Devolver k
Fin si
Asignar i i + 1
Si no entonces
Asignar k k + i - F[i]
Si i es mayor que 0 entonces
Asignar i F[i]
Fin si
Fin si
Repetir
Fin si

(si se alcanza este punto, se busc en todas las T sin xito)


Devolver longitud de T, si se usa una variable con signo, devolver
-1
Lenguaje C++
int busquedaKMP(char *p, char *a)
{
int i,j, M=strlen(p), N=strlen(a);
inicprox(p);
for(i=0, j=0;j<M && i<N; i++, j++)
while((j<=0) && (a[i]!=p[j]))
j=prox[j];
if(j==M)
return i-M;
else
return i;
}
Algoritmo para el llenado de la tabla:
Pseudocdigo

Algoritmo TablaKMP:
Entrada:
un array de caracteres, P (la palabra/texto que va a ser
analizada)
un array de enteros, F (la tabla de fallos a rellenar) debe
tener el mismo tamao que P.
Salida:
nada, no devuelve valores( pero por referencia, devuelve la
tabla rellenada)

variables que se usan:


un entero, pos 2 (la posicin actual donde se est
calculando F)
un entero, cnd 0 (el ndice en P del siguiente carcter del
actual candidato en la
subcadena)

(algunos valores se fijan con determinado valor, y por tanto no


estn sujetos a lo que cabra
esperar del algoritmo, esto se explica ms arriba, en el
apartado de la descripcin)
asignar F[0] -1, F[1] 0

Hacer mientras pos sea menor o igual que el tamao de P:


(caso 1: siguiente candidato coincidente en la cadena)
Si P[pos - 1] = P[cnd] entonces
Asignar cnd cnd + 1, F[pos] cnd, pos pos + 1
(caso 2: cuando empieza a fallar las coincidencias
consecutivas, entonces
asignamos un valor ya conocido la 1 vez)
Pero si cnd > 0 entonces
Asignar cnd F[cnd]
(caso 3: no se hall candidatos coincidentes (otra vez))
Y si no entonces
Asignar F[pos] 0, pos pos + 1
Fin si
Repetir
Lenguaje C++
inicprox(char *p)
{
int i, j, M=strlen(p);
prox[0]=-1;
for(i=0, j=-1; i<M; i++, j++, prox[i]=j)
while((j>=0) && (p[i]!=p[j]))
j=prox[j];
}

You might also like