Você está na página 1de 15

Algoritmo

Knuth-Morris-Pratt
Alumno: Jos Luis Segura Velzquez
8157349
Profesora: Mtra. Maria Elena Chvez Sols
Materia: Tpicos Selectos de Algoritmos

Autores
El algoritmo fue publicado en 1977 por :
Donald Ervin Knuth(1938): Es uno de los ms reconocidos
expertos en ciencias de la computacin por su
investigacin dentro del anlisis de algoritmos y
compiladores. Es Profesor Emrito de la Universidad de
Stanford.
Vaughan Ronald Pratt (1944): Es uno de los pioneros en el
campo de la ciencia computacional, sus principales
aportaciones son en la materia de algoritmos de busqueda
y de ordenamiento
James Hiram Morris (1941): Desarrollo conceptos
fundamentales en la teora de lenguajes computacionales
como : proteccin inter mdulos y evaluacin tarda de
variables.

Descripcin
El algoritmo de Knuth-Morris-Pratt es un mtodo
lineal para la bsqueda exacta de patrones.
Se basa en el hecho que, despus de encontrar el
primer smbolo que no coincide entre el patrn y la
secuencia, nosotros ya conocemos los smbolos del
patrn que hemos comparado hasta ese punto.
De esta manera, se consigue que despus de un
emparejamiento incorrecto el proceso no contine
(desde el inicio del patrn) con el siguiente carcter
de la secuencia, y as no tener que comparar
posiciones que ya se sabe previamente que no
darn lugar a una ocurrencia exacta del patrn.

Eficiencia
Las
particularidades
de
este
algoritmo son que es capaz de
realizar la bsqueda en un tiempo
lineal, con un tiempo adicional de pre
procesado que es lineal al patrn que
vamos a buscar. Lo cual hace una
aproximacin
para
realizar
las
bsquedas rpidamente.
Denotado como: O(m+n)

Descripcin
El KMP se beneficia de la informacin que el propio
patrn contiene ya que se desconoce la secuencia donde
se realiza la bsqueda.
Para aprovechar este hecho, hay que construir una tabla
de desplazamientos coincidentes dentro del patrn antes
de empezar la bsqueda.
Esta tabla, llamada next table, tiene una posicin para
cada posicin del patrn, y en cada posicin n se
introducir el nmero mximo de smbolos coincidentes
con el patrn antes de esa posicin (sin coincidir el
prefijo entero de n smbolos). Es decir, en cada posicin n
se comprueban las coincidencias existentes entre los
diferentes prefijos de n y el patrn que precede a n.

Pseudocdigo de
Pre procesamiento
Algoritmo next_table:
entrada:
char [] W (El patron a buscar)
int [] T (la tabla que se llenara)

salida:
nada (solo se llena la tabla en el proceso)

variables:
int pos 2 (la posicion que estamos procesando
en T)
int cnd 0 (El indice con base 0 en W del
siguiente caracter de la subcadena candidata)

T[0] = -1, T[1] = 0


while (pos < W.lenght)
if (W[pos - 1] = W[cnd])
T[pos] = cnd + 1, pos++ , cnd++
else if (cnd > 0)
cnd = T[cnd]
else
T[pos] = 0, pos++

Pseudocdigo de
Bsqueda
Algoritmo kmp_search:
entrada:
char [] S (El texto donde se buscar)
char [] W (El patron a buscar)

salida:
Un int (el ndice con base 0 de S donde W es
encontrado)

variables:
int m = 0 (el inicio de la concidencia actual en S)
int i = 0 (la posicin del caracter actual en W)
int [] T (la tabla que se pre proceso)

Pseudocdigo de
Bsqueda
while (m + i < S.length)
if (W[i] = S[m + i])
i = i++
if (i == W.length)
return m
else
m = m + i - T[i]
if (T[i] > -1)
i = T[i]
else
i=0
(Si se llega a este punto entonces no se encontr el patron)
return S.length

Ejemplo
Encontrar el patrn: GCAGAGAG
En el texto:
GCATCGCAGAGAGTATACAGTACG
La tabla calculada es:

GRACIA
S!

Você também pode gostar