Beruflich Dokumente
Kultur Dokumente
AGUSTN
Facultad de Produccin y Servicios
ESCUELA PROFESIONAL DE
INGENIERIA DE SISTEMAS
TEMA 09 (32.4)
The Knuth-Morris-Pratt
algorithm
DOCENTE:
ALUMNOS:
AREQUIPA PER
2017
1
Algoritmo Knuth-Morris-Pratt
1.- Introduccin
Al igual que fuerza bruta este algoritmo busca una subcadena dentro de una cadena principal.
El algoritmo originalmente fue elaborado por Donald Knuth y Vaughan Pratt y de modo
independiente por James H. Morris en 1977, pero lo publicaron juntos los tres.
Finalmente, se tendr una comparacin de este algoritmo frente a otros conocidos mediante grficas
para poder visualizar la eficiencia de este algoritmo para la bsqueda de patrones.
2.- Descripcin
Este algoritmo busca sub cadenas dentro de una cadena. ste se apoya en una tabla llamada "Tabla
de fallos", en la cual se guarda informacin de la cadena a buscar con el objetivo de que cada
carcter en el texto sea comparado slo una vez.
La mejora que muestra este algoritmo respecto al de fuerza bruta (comparar cada elemento del
patrn a buscar con cada elemento del texto), es que aprovecha informacin que tiene la cadena
que ser buscada dentro de s misma. Cuando ocurre un fallo en la comparacin entre sta y el
texto, se da una cierta cantidad de saltos para que ningn elemento de l sea analizado ms de una
vez.
Partiendo del texto a buscar, elaboramos una lista con todas las posiciones, de salto atrs que
sealen cunto se retrocede desde la posicin actual del texto a buscar.
3.- Desarrollo
2
El algoritmo KMP consta de dos partes una tabla de fallos y la funcin KMP que compara el texto
con el patrn.
3.3 METODO 1
Caso 1: Sin patrn y la letra de fallo del patrn es la misma que la inicial
Ejemplo
P= abca
S= a b c Z ? ? ?
P= a b c A
a b c a
Situar el inicio del patrn tras el carcter de fallo. Se representa con -1 en la tabla de fallos
Caso 2: Sin patrn y letra de fallo del patrn es distinta al valor inicial.
Ejemplo
3
P= abcd
S= a b c ? ? ? ?
P= a b c d
a b c d
El ultimo termino no es una d, pero puede ser una a.
Situar el inicio del patrn en el carcter de fallo y volver a comprobar desde ese nuevo inicio. Se
representa con 0 en la tabla de fallos.
Caso 3: Hay patrn y la letra siguiente al patrn de la izquierda es diferente al carcter de fallo
Ejemplo
P = XYXYY
S= X Y X Y ? ? ?
P= X Y X Y Y
X Y X Y
Situar el inicio del patrn m posiciones a la izquierda del carcter del fallo, donde m es el tamao del
patrn. Se representa con el tamao m en la tabla de fallos.
Caso 4: Hay patrn y la letra siguiente al patrn de la izquierda es igual al carcter de fallo
S= X Y X Y ? ? ?
P= X Y X Y X
X Y X Y
No tiene sentido este movimiento porque sabemos que este movimiento va a fallar.
Entonces se hace los siguiente
S= X Y X Y ? ? ?
P= X Y X Y X
X Y X Y
Se sita el inicio del patrn donde lo situara la letra siguiente al patrn de la izquierda. Se
representa con el valor del siguiente carcter a la izquierda del patrn.
Se P el patrn = ABCABCACAB
Siempre buscar el patrn ms largo talque el patrn de la izquierda debe empezar en la posicin 0 y
el patrn de la derecha debe acabar posicin n-1(anterior) al carcter de fallo.
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente
Posicin 0
El primer carcter siempre lleva el valor -1, pues si falla solo se recorre una posicin para probar el
valor inicial.
Posicin 0 1 2 3 4 5 6 7 8 9
4
Patrn A B C A B C A C A B
siguiente -1
Posicin 1
No hay patrn, el carcter de fallo es distinto a valor inicial, entonces estamos en el caso 2.
Entonces procedemos a colocar el valor 0.
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0
Posicin 2
No hay patrn, el valor de fallo es diferente del valor inicial (C A o P[2] P[0]), Caso 2
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0
Posicin 3
No hay patrn, el valor de fallo es igual al valor inicial (A = A o P[3] = P[0]), Caso 1
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0 -1
Posicin 4
Hay Patrn de tamao m=1, el siguiente valor al patrn es igual al valor de fallo (B = B o P[1] = P[4]).
Caso 4
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0 -1 0
Posicin 5
Hay patrn de tamao m=2, el siguiente valor al patrn es igual al valor de fallo (C=C o P[2]=P[5]),
Caso 4
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0 -1 0 0
Posicin 6
Hay patrn de tamao m=3, el siguiente valor al patrn es igual al valor de fallo (A=A o P[3]=P[6]),
Caso 4
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0 -1 0 0 -1
5
Posicin 7
Hay patrn de tamao m=4, el siguiente valor al patrn es diferente al valor de fallo (P[4]P[7]),
Caso 3
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0 -1 0 0 -1 4
Posicin 8
No hay patrn, el valor inicial es igual al valor de fallo (P[0]=P[8]) caso 1
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0 -1 0 0 -1 4 -1
Posicin 9
Hay patrn de tamao m=1, el siguiente valor al patrn es igual al valor de fallo (P[1] = P[9]), Caso 4
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0 -1 0 0 -1 4 -1 0
C= ABCABCAAABABCABABCABCACAB
Tabla de Fallos
Posicin 0 1 2 3 4 5 6 7 8 9
Patrn A B C A B C A C A B
siguiente -1 0 0 -1 0 0 -1 4 -1 0
Empezamos a comparar
i 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
C A B C A B C A A A B A B C A B A B C A B C A C A B
P A B C A B C A C
En la posicin 7 no hay coincidencia, entonces en la posicin 7 del patrn verificamos que valor
acumula. En este caso es 7 por lo tanto la cadena retrocede 7(posicin en el fallo) 4(valor en la
tabla de fallo) = 3, entonces de la posicin 3 empieza a comparar nuevamente.
i 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
C A B C A B C A A A B A B C A B A B C A B C A C A B
P A B C A B
6
Ahora nuevamente se da un fallo en la posicin 7, ahora verificamos que valor contiene esa letra en
la que fallos y es la posicin 4 de la tabla de fallos y contiene 0, entonces toda la cadena recorre a la
posicin donde ocurri el fallo, para empezar a comparar nuevamente.
i 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
C A B C A B C A A A B A B C A B A B C A B C A C A B
P A B
Un nuevo fallo en la posicin 10, y para el patrn es la posicin 2 y en su tabla de fallos contiene un
0, por lo tanto, nuevamente recorreos todo el patrn hacia la posicin 10 para empezar a comparar.
i 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
C A B C A B C A A A B A B C A B A B C A B C A C A B
P A B C A B C
3.4 METODO 2
Otro mtodo para hallar la matriz de fallos es inicializando al primer elemento de la matriz en 0.
Y hallando el resto comparando el contenido de la posicin siguiente con la anterior.
7
Por ejemplo el siguiente patrn: ABCDABD se calculara de la siguiente forma:
j 0 1 2 3 4 5 6
p[j] A B C D A B D
f[j] 0
Luego se comparara el siguiente valor con el anterior si son iguales el valor de la matriz de
fallo en esa posicin ser igual al de la posicin j aumentado en 1 y si no lo son j tomara el
valor anterior almacenado en la matriz j=f[j-1] y volver a comparar el contenido con la
siguiente posicin.
j 0 1 2 3 4 5 6
p[j] A B C D A B D
f[j] 0 0
j 0 1 2 3 4 5 6
p[j] A B C D A B D
f[j] 0 0
j 0 1 2 3 4 5 6
p[j] A B C D A B D
f[j] 0 0 0
j 0 1 2 3 4 5
p[j] A B C D A B
f[j] 0 0 0 0 (j=0)=>(j+1)=1
j 0 1 2 3 4 5
p[j] A B C D A B
f[j] 0 0 0 0 1 j+1=2
8
j 0 1 2 3 4 5 6
p[j] A B C D A B D
f[j] 0 0 0 0 1 2
Si al momento de comparar los contenidos estos no son iguales y j>0 (en este caso j=2= c)
entonces j ser igual al valor de su posicin -1 es decir j=f[j-1] => j= f[0] y nuevamente
compara.
j 0 1 2 3 4 5 6
p[j] A B C D A B D
f[j] 0 0 0 0 1 2 0
Si nuevamente no son iguales pero j=0 entonces la matriz en esa posicin (D) tomara el
valor de 0.
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Cad A B C A B C D A B A B C D A B C D A B D E
Pat A B C D A B D
Matriz de fallos
i 0 1 2 3 4 5 6
P[i] A B C D A B D
F[i] 0 0 0 0 1 2 0
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Cad A B C A B C D A B A B C D A B C D A B D E
Pat A B C D A B D
En caso de error j tomara el valor de la matriz de fallos en j= F[j-1] => j=0 i quedara igual.
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Cad A B C A B C D A B A B C D A B C D A B D E
Pat A B C D A B D
9
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Cad A B C A B C D A B A B C D A B C D A B D E
Pat A B C D A B D
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Cad A B C A B C D A B A B C D A B C D A B D E
Pat A B C D A B D
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Cad A B C A B C D A B A B C D A B C D A B D E
Pat A B C D A B D
i avanza y j se mantiene en 0
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Cad A B C A B C D A B A B C D A B C D A B D E
Pat A B C D A B D
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Cad A B C A B C D A B A B C D A B C D A B D E
Pat A B C D A B D
Al ser j igual al tamao de patrn disminuido en 1 el algoritmo acaba dando como resultado
la posicin de donde fue encontrado el patrn es decir i-j. (21-6= 15)
10
3.5.2 Pseudocodigo Funcin KMP
11
3.7 Algoritmo implementado para el Mtodo 2
12
13
4 Anlisis del algoritmo (Cdigo del mtodo 1 implementacin del
pseudocdigo del libro Cormen)
Los procedimientos FUNCION-FALLO y KMP tienen mucho en comn, ya que ambos coinciden con
una cadena contra el patrn P, KMP coincide con el texto T contra P, y FUNCION-FALLO con P
contra s mismo.
5 Anlisis de graficas
14
A continuacin se ver la rapidez del algoritmo KMP con respecto a otros dos algoritmos bastante
conocidos como los son el de fuerza bruta el BMH
Para el resultado de las grficas se toma como prueba la ejecucin de los algoritmos en 3
distintos casos de aplicacin en alfabetos: binario, leguaje ingls y en una simulacin de
prueba de ADN.
Para el caso del alfabeto Binario la cantidad de caracteres que posee es bastante reducida, ya que
solo son 2, lo cual hace que la probabilidad de repeticin de estos sea bastante elevada con
respecto a los otros dos lenguajes. Sin embargo aun as el tiempo del KMP es mucho mejor.
5.1.2 ADN
En el caso del ADN se puede ver que el tiempo tomado es bastante similar entre el caso real y
sinttico, pero este ltimo tiende a ser mayor. Esto puede deberse a la forma en que se construye el
ADN, con secuencias definidas que en ocasiones tienen posiciones determinadas en una cadena
(como un marcador de inicio o fin), lo que hace poco probable que en una cadena real hayan
15
segmentos que puedan ser reutilizados para formar otra posible ocurrencia, producindose as
fallos ms frecuentes y saltos ms largos.
Conclusiones
16
1. El tiempo de ejecucin del algoritmo KMP es ptimo (O (m + n)), que es muy rpido.
2. El algoritmo nunca necesita moverse hacia atrs en el texto de entrada T. Hace que el
algoritmo sea bueno para procesar archivos muy grandes.
3. el lenguaje real las palabras se escriben usando letras de forma particular, con vocales cada
cierta frecuencia, silabas comunes, lo que hace que la bsqueda pueda llegar a dar saltos
mas grandes, a diferencia en cadenas de ADN, nmeros binarios.
6 Referencias
17
[1] Introducction to Algorithms 3 edition. Thomas H. Cormen, Charles E. Leiserson. Ronald L. Rivest,
Clifford Stein
[2] Knuth.Morris-Pratt Algorithm: An analisis, Mireille Regnier
[3] Algoritmos in Bioinformatics
[4]Anlisis de algoritmos de Busqueda de un solo patrn, Sergio Talens-Ollag
[5]Bsqueda en Texto, Moreno Edward y Rubilar Felipe
[6] https://www.youtube.com/watch?v=Kglp2Sy5dr0: : Algoritmia- Tema 3: Algoritmos de Bsqueda
KMP, Muos Ortega Andrs UCAM - Universidad Catlica de Murcia
18