Você está na página 1de 18

UNIVERSIDAD NACIONAL DE SAN

AGUSTN
Facultad de Produccin y Servicios

ESCUELA PROFESIONAL DE
INGENIERIA DE SISTEMAS
TEMA 09 (32.4)

The Knuth-Morris-Pratt
algorithm
DOCENTE:

Mg. Carlo Corrales Delgado


UNS

ALUMNOS:

-CONDORI HUARCA ANDRES


-QUISPE SOTO DARWIN
A

-TICONA PINTO ARTURO

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.

En el siguiente trabajo se explicar el funcionamiento, implementacin del algoritmo utilizando el


lenguaje Java y su anlisis de costo computacional.

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.

Ejemplo de Funcionamiento a grandes rasgos KMP

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.1 Funcin de Fallo


Crea el arreglo que ser utilizado como tabla de fallos. A medida que se recorre el patrn, el
algoritmo va buscando ocurrencias de algn prefijo del mismo y guardando en el arreglo la longitud
de la ocurrencia ms larga hasta la posicin anterior. As, al acceder a la tabla se sabe la cantidad de
caracteres que se pueden reutilizar, adems de la posicin en el patrn desde donde debe continuar
la bsqueda.
3.1.1 Tabla de Fallos (conocida como 'funcin de fallo')
El objetivo de la tabla (pre calculada) de fallo 'F' es no permitir que cada carcter del array 'T()'
sea examinado ms de 1 vez. El mtodo clave para lograr esto, consiste en haber comprobado
algn trozo de la cadena donde se busca con algn trozo de la cadena que se busca, lo que
nos proporciona en qu sitios potenciales puede existir una nueva coincidencia, sobre el sector
analizado que indica fallo.
Por tanto, esta tabla se confecciona con la distancia que existe desde un punto en la palabra a la
ltima ocurrencia distinta de la primera vez que aparece, y mientras sigan coincidiendo, se marca
la distancia, cuando haya una ruptura de coincidencia se marca 0 o un valor previo ya calculado
anteriormente, y as sucesivamente hasta terminar con el texto.

3.2 funcin KMP (String pattern)


Realiza una bsqueda del patrn dado siguiendo el algoritmo explicado en la descripcin. Al
encontrar un match, se incrementa el contador de ocurrencias (no nos interesa cuales son en
nuestro anlisis) y se continua tal como si hubiera ocurrido un error (es decir, moviendo los punteros
del texto y el patrn segn la tabla de fallos), lo que permite reutilizar un sufijo del patrn como
prefijo de una nueva posible ocurrencia, si el patrn lo permite.

3.3 METODO 1

3.3.1 Casos para conseguir la funcin de fallo

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.

3.3.2 Explicacin del Funcionamiento. Para la Tabla de Fallos

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

3.3.3 Buscar el Patrn con la Cadena

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

Ahora se da un fallo en la posicin 8, pero para el patrn es la posicin 1 que contiene a B, y


contiene un valor de 0 en la tabla de fallo, entonces todo el patrn ce mueve hacia la posicin 8. y
nuevamente comparamos.
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

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

Ahora el fallo se da en la posicin 15, y para el patrn es la posicin 5 y en su tabla de fallos


contiene un 0, por lo tanto, todo el patrn se mueve hacia la posicin 15 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 A C A B

Encontr el patrn en la cadena y ah finaliza y para este ejemplo ah Finaliza.

3.4 METODO 2

3.4.1 Explicacin del Funcionamiento. Para la Tabla de Fallos

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.

3.4.2 Buscar el Patrn con la Cadena con la matriz de fallo

i recorrer la cadena principal mientras que j el patrn a buscar ambos inicializan 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

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

En caso de que haya error y j =0 entonces solo i avanza y j se mantiene en

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

Nuevamente j tomara el valor de la matriz en j=f[j-1] j=2; y empezara nuevamente a


comparar desde esa posicin.

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

j tomara la el valor de la matriz nuevamente siendo este j=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 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

j=2 y compara desde esa posicin:

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)

3.5 Pseudocdigo General Del libro Introduction to Algorithms

3.5.1 Pseudocodigo Funcin-Fallo

10
3.5.2 Pseudocodigo Funcin KMP

3.6 Algoritmo Implementado para el Mtodo 1

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.

4.1 Anlisis del tiempo de Ejecucin FUNCION-FALLO

El tiempo de ejecucin de FUNCION-FALLO es (m), que se muestra utilizando el mtodo


agregado de anlisis amortizado La nica parte difcil es mostrar que el bucle while de las lneas 6-7
ejecuta O(m) veces en total.
Mostraremos que hace como mximo m - 1 iteraciones.
Comenzamos haciendo algunas observaciones sobre k. En primer lugar, la lnea 4 comienza k = 0, y
la nica forma en que k aumenta es mediante la operacin de incremento en la lnea 9, que se
ejecuta como mximo una vez por iteracin del bucle for de las lneas 5-10. Por lo tanto, el
incremento total en k es como mximo m -1.
En segundo lugar, puesto que k < q al entrar en el bucle for y en cada iteracin de los incrementos
de bucle q, siempre tenemos k < q. Por lo tanto, las asignaciones en las lneas 3 y 10 aseguran que
|q| < q para todo q = [1, 2,3, . . ., m] lo que significa que cada iteracin del bucle while disminuye k.
Tercero, k nunca llega a ser negativo. Haciendo estos hechos juntos, vemos que la disminucin total
en k del bucle while est limitada desde arriba por el incremento total en k sobre todas las
iteraciones del bucle for, que es m - 1.
Por lo tanto, el bucle while itera como mximo m - 1 veces en total, y COMPUTE-PREFIXFUNCTION
se ejecuta en el tiempo (m).

4.2 Anlisis del tiempo de Ejecucin FUNCION KMP

El anlisis de ejecucin de la funcin KMP es similar a la de la funcin de fallo.


Iniciamos evaluando que q inicia en 0 linea 4, su nica forma de aumentar es mediante el la
condiciona IF que esta en el bucle FOR (lnea 5-12).
Por lo tanto el mximo valor de q es n-1 (tamao de la cadena o texto).
En segundo lugar, puesto que q < i al entrar en el bucle for y en cada iteracin de los incrementos de
bucle q, siempre tenemos k < q. Por lo tanto, las asignaciones en las lneas 5 y 12 aseguran que |q|
< i para todo q = [1, 2,3, . . .,n] lo que significa que cada iteracin del bucle while disminuye q.
q nunca llega a ser negativo, Haciendo estos hechos juntos, vemos que la disminucin total en q del
bucle while est limitada desde arriba por el incremento total en q sobre todas las iteraciones del
bucle for, que es n - 1.
Entonces el llamado a la funcin de fallo (lnea 3) tiene un peso m y la propia funcin KMP tiene un
peso n, esto da un costo m+n => ( n+ m).

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.

5.1.1 Alfabeto Binario

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.

5.1.3 Lenguaje Ingles

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.

4. Imprescindible en gran nmero de aplicaciones:


Procesadores de textos,
utilidades como el grep de unix,
programas de recuperacin de informacin textual,
programas de bsqueda en catlogos de bibliotecas,
buscadores de internet,
lectores de news en internet,
bibliotecas digitales,
revistas electrnicas,
directorios telefnicos,
enciclopedias electrnicas,
bsquedas en bases de datos de secuencias de ADN o ARN.

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

Você também pode gostar