Documentos de Académico
Documentos de Profesional
Documentos de Cultura
• Algoritmos de Fuerza-bruta
• Algoritmos Voraces
• Algoritmos Divide y vencerás
• Backtracking (vuelta atrás) recursivo.
• Programación Dinámica
Objetivos de la Clase
x y x x y x y x y y x y x y x y y x y x y x x
1 x y x y
2 x
3 x y
4 x y x y y
5 x
6 x y x y y x y x y x x
7 x
8 x y x
9 x
10 x
11 x y x y y
12 x
13 x y x y y x y x y x x
Algoritmo Knuth-Morris-Pratt (KMP)
Otro ejemplo:
T = ‘yyyyyyyyyyyyx’ P = ‘yyyyyx’
• Con el algoritmo de fuerza bruta, las cinco ‘y’ del patrón se comparan con la
cadena madre, se encuentra la discrepancia de la ‘x’, se “desplaza” el patrón un
lugar a la derecha y se hacen cuatro comparaciones redundantes:
• ¡las cuatro primeras ‘y’ ya sabemos que están ahí!
• Se desplaza el patrón un lugar más a la derecha y ¡de nuevo cuatro
comparaciones redundantes !Etcétera.
Algoritmo Knuth-Morris-Pratt (KMP)
Un ejemplo más:
T = ‘xyyyyxyyxyyyyy’ P = ‘xyyyyy’
• Buscamos la ocurrencia de una ‘x’ seguida de cinco ‘y’.
• Si el número de ‘y’ no es suficiente, no hay necesidad de volver atrás y
desplazar una posición a la derecha.
• Las cuatro ‘y’ encontradas no valen para nada y hay que buscar una nueva ‘x’.
Algoritmo Knuth-Morris-Pratt (KMP)
Volviendo al ejemplo inicial: T = ‘xyxxyxyxyyxyxyxyyxyxyxx’ P = ‘xyxyyxyxyxx’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
x y x x y x y x y y x y x y x y y x y x y x x
1 x y x y
2 x
3 x y
4 x y x y y
5 x
6 x y x y y x y x y x x
• Ocurre una discrepancia en p5 (con t8 , la línea 4).
• Los dos caracteres precedentes de T han tenido que ser ‘xy’ (es decir, p3 p4 , porque hasta p4
hubo coincidencia).
• Pero los dos primeros caracteres de P también son ‘xy’, luego no hace falta volverlos a comparar
con p3 p4 .
• Lo ideal sería desplazar P a la derecha el máximo número posible de posiciones (para ahorrar
comparaciones) pero sin perder ninguna posibilidad de encontrar el patrón en T.
• En el ejemplo, hay que desplazar P dos posiciones y continuar comparando s8 con p3
(ahorramos tres comparaciones).
Algoritmo Knuth-Morris-Pratt (KMP)
Notar que la discusión anterior es independiente de la cadena madre T.
Conocemos los últimos caracteres de T porque han coincidido con los anteriores del patrón P.
Sigamos con el ejemplo...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
x y x x y x y x y y x y x y x y y x y x y x x
. . . . . . . . . . . . . . . . . . . . . . .
6 x y x y y x y x y x xx
7 x
8 x y x
9 x
10 x
11 x y x y y
12 x
13 x y x y y x y x y x x
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
x y x x y x y x y y x y x y x y y x y x y x x
. . . . . . . . . . . . . . . . . . . . . . .
6 x y x y y x y x y x x
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
x y x x y x y x y y x y x y x y y x y x y x x
. . . . . . . . . . . . . . . . . . . . . . .
6 x y x y y x y x y x x
.
13 x y x y y x y x y x x
Algoritmo Knuth-Morris-Pratt (KMP)
• Notar, de nuevo, que toda la información necesaria para saber cuánto hay que
desplazar a la derecha el patrón está incluida en el propio patrón.
• Se puede “preprocesar” (o precondicionar) el patrón para acelerar el algoritmo
de fuerza bruta.
• La idea es la siguiente:
• La cadena madre S siempre se recorre hacia la derecha (no hay retrocesos), aunque un
mismo carácter de S puede compararse con varios del patrón P (cuando haya
discrepancias).
• Cuando haya una discrepancia se consultará una tabla para saber cuánto hay que
retroceder en el patrón o, dicho de otra forma, cuántos desplazamientos del patrón hacia la
derecha pueden hacerse.
• En la tabla hay un entero por cada carácter de P, e indica cuántos desplazamientos hacia la
derecha deben hacerse cuando ese carácter discrepe con uno de la cadena madre.
Algoritmo Knuth-Morris-Pratt (KMP)
• Función de fallo de KMP
• Para cada pi de P, hay que calcular el sufijo más largo 𝑝𝑖−𝑗 𝑝𝑖−𝑗+1 … 𝑝𝑖−1 que es
igual al prefijo de P:
• f(i) = max { j | 0<j<i-1, 𝑝𝑖−𝑗 𝑝𝑖−𝑗+1 … 𝑝𝑖−1 = 𝑝1 𝑝2 … 𝑝𝑗 } 0 si no existe tal j
i 1 2 3 4 5 6 7 8 9 10 11
P x y x y y x y x y x X
f
Algoritmo Knuth-Morris-Pratt (KMP)
• Ejemplo
• P=XYXYYXYXYXX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y X X Y X Y Y X Y X Y X Y
P= X Y X Y Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Ejemplo
• P=XYXYYXYXYXX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y X X Y X Y Y X Y X Y X Y
P= X Y X Y Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Ejemplo
• P=XYXYYXYXYXX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y X X Y X Y Y X Y X Y X Y
P= X Y X Y Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Ejemplo
• P=XYXYYXYXYXX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y X X Y X Y Y X Y X Y X Y
P= X Y X Y Y
X Y X Y
Algoritmo Knuth-Morris-Pratt (KMP)
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C Z ? ? ?
P= A B C A
Algoritmo Knuth-Morris-Pratt (KMP)
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C Z ? ? ?
P= A B C A
A B C A
Algoritmo Knuth-Morris-Pratt (KMP)
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C Z ? ? ?
P= A B C A
A B C A
Algoritmo Knuth-Morris-Pratt (KMP)
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C Z ? ? ?
P= A B C A
A B C A
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 1: Sin patrón y la letra de fallo del patrón es la misma
que la inicial
• P=ABCA
• Situar el inicio del patrón tras el carácter de fallo
• Se representa con -1 en la tabla siguiente de KMP
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C Z ? ? ?
P= A B C A
A B C A
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 2: Sin patrón y la letra de fallo del patrón es distinta
que la inicial
• P=ABCD
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C ? ? ? ?
P= A B C D
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 2: Sin patrón y la letra de fallo del patrón es distinta
que la inicial
• P=ABCD
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C ? ? ? ?
P= A B C D
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 2: Sin patrón y la letra de fallo del patrón es distinta
que la inicial
• P=ABCD
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C ? ? ? ?
P= A B C D
A B C D
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 2: Sin patrón y la letra de fallo del patrón es distinta
que la inicial
• P=ABCD
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C ? ? ? ?
P= A B C D
A B C D
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 2: Sin patrón y la letra de fallo del patrón es distinta
que la inicial
• P=ABCD
• Situar el inicio del patrón en el carácter de fallo y volver a comparar desde ese
nuevo inicio.
• Se representa con 0 en la tabla siguiente de KMP
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= A B C ? ? ? ?
P= A B C D
A B C D
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 3: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYY
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y Y
• X≠Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 3: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYY
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y Y
• X≠Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 3: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYY
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y Y
• X≠Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 3: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYY
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y Y
• X≠Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 3: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYY
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y Y
• X≠Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 3: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYY
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y Y
• X≠Y X Y X Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 3: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYY
• Situar el inicio del patrón m posiciones a la izquierda del carácter del fallo,
donde m es el tamaño del patrón (m=2 en este ejemplo).
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y Y
• X≠Y X Y X Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
X Y X Y
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
X Y X Y
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
X Y X Y
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
X Y X Y
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
• X=X
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
• X=X
X Y X Y
Algoritmo Knuth-Morris-Pratt (KMP)
• Caso 4: Hay patrón y la letra siguiente al de la izquierda es
distinta al carácter de fallo.
• P=XYXYX
• Situar el inicio del patrón donde lo situaría la letra siguiente al patrón de la
izquierda.
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
S= X Y X Y ? ? ?
P= X Y X Y X
• X=X X Y X Y
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
• No hay patrón. X(fallo) igual X(inicial) Caso 1
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
• No hay patrón. X(fallo) igual X(inicial) Caso 1
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
• Hay patrón! P[0] == P[2], pero
• Siguiente patrón izquierda (P[1]== carácter fallo (P[3]) Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
• Hay patrón! P[0] == P[2], pero
• Siguiente patrón izquierda (P[1]== carácter fallo (P[3]) Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón! P[0] P[1] == P[2] P[3], y
siguiente patrón izquierda (P[2] ≠ carácter fallo (P[4]) Caso 3
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón! P[0] P[1] == P[2] P[3], y
siguiente patrón izquierda (P[2] ≠ carácter fallo (P[4]) Caso 3
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
No hay patrón…. X (fallo) igual X (inicial) Caso 1
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
No hay patrón…. X (fallo) igual X (inicial) Caso 1
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
P[6] se comporta como P[1]
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
P[6] se comporta como P[1]
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón tamaño 2, pero P[2] igual a carácter de fallo Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón tamaño 2, pero P[2] igual a carácter de fallo Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón tamaño 2, pero P[2] igual a carácter de fallo Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón tamaño 2, pero P[2] igual a carácter de fallo Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón tamaño 3, pero P[3] igual a carácter de fallo Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón tamaño 3, pero P[3] igual a carácter de fallo Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón tamaño 3, pero P[3] igual a carácter de fallo Caso 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
• Hay patrón! P[0]P[1]P[2]P[3] = P[5]P[6]P[7]P[8] y
• Siguiente oatrón izquierda (P[4] ≠ carácter fallo P[9]) Caso 3. Tamaño patrón 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
• Hay patrón! P[0]P[1]P[2]P[3] = P[5]P[6]P[7]P[8] y
• Siguiente oatrón izquierda (P[4] ≠ carácter fallo P[9]) Caso 3. Tamaño patrón 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
• Hay patrón! P[0]P[1]P[2]P[3] = P[5]P[6]P[7]P[8] y
• Siguiente oatrón izquierda (P[4] ≠ carácter fallo P[9]) Caso 3. Tamaño patrón 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
• Hay patrón! P[0]P[1]P[2]P[3] = P[5]P[6]P[7]P[8] y
• Siguiente oatrón izquierda (P[4] ≠ carácter fallo P[9]) Caso 3. Tamaño patrón 4
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0 4
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0 4
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón! P[0]P[1]P[2] = P[7]P[8]P[9] y
siguiente patrón izquierda (P[3] ≠ carácter fallo P[10]) Caso 3. Tamaño patrón 3
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0 4
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón! P[0]P[1]P[2] = P[7]P[8]P[9] y
siguiente patrón izquierda (P[3] ≠ carácter fallo P[10]) Caso 3. Tamaño patrón 3
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0 4
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón! P[0]P[1]P[2] = P[7]P[8]P[9] y
siguiente patrón izquierda (P[3] ≠ carácter fallo P[10]) Caso 3. Tamaño patrón 3
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0 4
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=XYXYYXYXYXX
• Para buscar patrones: Se debe buscar el patrón mas largo tal que el patrón
de la izquierda debe empezar en la posición 0 y el patrón de la derecha
debe acabar en la posición anterior al carácter de fallo.
Hay patrón! P[0]P[1]P[2] = P[7]P[8]P[9] y
siguiente patrón izquierda (P[3] ≠ carácter fallo P[10]) Caso 3. Tamaño patrón 3
Pos 0 1 2 3 4 5 6 7 8 9 10
P X Y X Y Y X Y X Y X X
Sgte -1 0 -1 0 2 -1 0 -1 0 4 3
Algoritmo Knuth-Morris-Pratt (KMP)
Volviendo al ejemplo inicial: T = ‘xyxxyxyxyyxyxyxyyxyxyxx’ P = ‘xyxyyxyxyxx’
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
T x y x x y x y x y y x y x y x y y x y x y x x
P x y x y y x y x y x x
Pos 0 1 2 3 4 5 6 7 8 9
P A B C A B C A C A B
Sgte
Algoritmo Knuth-Morris-Pratt (KMP)
Calculo tabla siguiente o de fallo
• P=ABCABCACAB
Pos 0 1 2 3 4 5 6 7 8 9
P A B C A B C A C A B
Sgte -1 0 0 -1 0 0 -1 4 -1 0
Algoritmo Knuth-Morris-Pratt (KMP)
Codificar algoritmo KMP
• P=xyxyyxyxyxx
i pat[0:i] lps[i] Matching Prefix/Suffix
0 x 0
1 xy 0
2 xyx 1 x
3 xyxy 2 xy
4 xyxyy 0
5 xyxyyx 1 x
6 xyxyyxy 2 xy
7 xyxyyxyx 3 xyx
8 xyxyyxyxy 4 xyxy
9 xyxyyxyxyx 3 xyx
10 xyxyyxyxyxx 1 x
Algoritmo Knuth-Morris-Pratt (KMP)
Análisis de la función KMP:
• La cadena madre T se recorre sólo una vez, aunque un carácter 𝑠𝑖 de S puede
que haya que compararlo con varios de P
• ¿Cuántas veces se puede llegar a comparar un carácter 𝑠𝑖 de S con otros de P?
• Supongamos que la primera comparación de si se hace con pk . Por tanto,
en particular, se ha avanzado k veces en P hasta hacer esa comparación y sin
retroceder ninguna vez.
• Si 𝑠𝑖 ≠ 𝑝𝑘 , se retrocede en P (usando la tabla f). Sólo se puede retroceder un
máximo de k veces.
• Si se suma el coste de los retrocesos al de los movimientos de avance,
únicamente se dobla el coste de los avances .Pero el nº de avances en P
coincide con el nº de avances en T y es n. Luego el número de
comparaciones es O(n).
• Con similares argumentos se demuestra que el coste del cálculo de la tabla f es
O(m), luego el coste total es O(n).
Algoritmo Knuth-Morris-Pratt (KMP)
Ventajas de KMP
• KMP funciona en el tiempo óptimo: O(m+n) “muy
rápido”
• El algoritmo nunca necesita moverse hacia atrás en el
texto de entrada, T
• esto hace que el algoritmo sea bueno para
procesar archivos muy grandes que se leen desde
dispositivos externos o a través de una secuencia
de red
Algoritmo Knuth-Morris-Pratt (KMP)
Desventajas de KMP
• KMP no funciona muy bien como el tamaño del
alfabeto aumenta
• Más posibilidades de un desajuste (más
posibles desajustes)
• Las discrepancias tienden a ocurrir al principio
del patrón, pero KMP es más rápido cuando las
discordancias ocurren más tarde