Académique Documents
Professionnel Documents
Culture Documents
reconocimiento de patrones
v Introducción 2
v Antecesores en un árbol 9
v Evaluación repetida de
un polinomio 12
v Reconocimiento de patrones 18
– Método directo 18
– Uso de firmas 21
– El algoritmo de Knuth, Morris y Pratt 26
– El algoritmo de Boyer y Moore 39
entrada entrada
algoritmo
algoritmo A(j∈J)
A(j∈J)
algoritmo
algoritmo T(〈j,k〉∈I)
T(〈j,k〉∈I) entrada
salida
salida
algoritmo
algoritmo BBjj(k∈K)
(k∈K)
salida
Solución a 〈j,k〉
v Ejemplo:
– J es un conjunto de gramáticas en forma normal
de Backus para una familia de lenguajes de
programación (Algol, Pascal, Simula, …).
– K es un conjunto de programas.
– Familia de problemas:
Saber si un programa dado es sintácticamente
correcto en un lenguaje dado.
Es decir,
I = { “¿es k∈K un programa en el lenguaje de
programación definido por
la gramática j∈J?” }
– Algoritmo de precondicionamiento:
A = generador de reconocedores:
aplicado sobre la gramática j∈J
genera un reconocedor Bj.
– Sean:
v Utilidad:
v Ejemplos:
v Ejemplo
1 A 13 prenum - postnum
2 B 5 7 C 12
3 D 1 4 E 3 6 F 4 8 G 6 9 H 11
5 I 2 10 J 7 11 K 8 12 L 9 13 M 10
1 A 13 prenum - postnum
2 B 5 7 C 12
3 D 1 4 E 3 6 F 4 8 G 6 9 H 11
5 I 2 10 J 7 11 K 8 12 L 9 13 M 10
– Se tiene:
prenum[u] ≤ prenum[v] ⇔
⇔ (u es antecesor de v ) ∨
(u está a la izquierda de v en el árbol)
postnum[u] ≥ postnum[v] ⇔
⇔ (u es antecesor de v ) ∨
(u está a la derecha de v en el árbol)
– Por tanto:
(prenum[u] ≤ prenum[v]) ∧
(postnum[u] ≥ postnum[v]) ⇔
⇔ u es antecesor de v
J. Campos - C.P.S. Esquemas algorítmicos - Precondicionamiento… Pág. 11
Evaluación repetida de
un polinomio
v Caso particular:
v Ejemplo:
p(x) = x 7 − 5x 6 + 4x 5 − 13x 4 + 3x 3 − 10x 2 + 5x −17
– Mejor aún:
(
p (x ) = x 4 + 2 )((x 2 + 3)(x − 5 )+ (x + 2 ))+ ((x 2 − 4 )x + (x + 9))
5 multiplicaciones
v En general:
(
p(x) = x 2
k−1
)
+a q(x ) +r (x ) ,
v En el ejemplo:
p(x) = x 7 − 5x 6 + 4x 5 − 13x 4 + 3x 3 − 10x 2 + 5x −17
Se expresa como:
( )( )(
p (x ) = x 4 + a x 3 + q2x 2 + q1x + q0 + x 3 + r 2x 2 + r 1x + r 0 )
Igualando los coeficientes de x6, x5, …, 1, se obtiene
( )( )(
p (x ) = x 4 + 2 x 3 − 5x 2 + 4x − 13 + x 3 − 3x + 9 )
De la misma forma, se obtienen:
( )( ) ( )
x 3 − 5x 2 + 4x − 13 = x 2 + 3 x − 5 + x + 2
x 3 − 3x + 9 = (x 2 − 4 )x + (x + 9 )
Para llegar a:
(
p (x ) = x 4 + 2 )((x 2 + 3)(x − 5 )+ (x + 2 ))+ ((x 2 − 4 )x + (x + 9))
– Ecuación de recurrencia:
0 si k = 0 ó k = 1
M’ (k ) =
2M ’(k − 1) + 1 si k ≥ 2
(n-3)/2 + log(n+1)
v Comentarios finales:
v Método directo:
función
función subcadena(S,P:cadena;
subcadena(S,P:cadena; n,m:natural)
n,m:natural)
devuelve
devuelve natural
natural
{Devuelve
{Devuelve rr si
si la
la primera
primera aparición
aparición dede PP en
en SS
empieza
empieza en
en la
la posición
posición rr (i.e.
(i.e. es
es el
el entero
entero másmás
pequeño tal que S
pequeño tal que Sr+i-1 =P para i=1,2,…,m), y
r+i-1=Pi para i=1,2,…,m), y
i
devuelve
devuelve 00 si
si PP no
no es
es subcadena
subcadena de
de S}
S}
variables
variables ok:booleano;
ok:booleano; i,j:natural
i,j:natural
principio
principio
ok:=falso;
ok:=falso; i:=0;
i:=0;
mq
mq not
not ok and ii≤≤n-m
ok and n-m hacer
hacer
ok:=verdad;
ok:=verdad; j:=1;j:=1;
mq
mq ok and jj≤≤mm hacer
ok and hacer
si P[j]≠≠S[i+j]
si P[j] S[i+j]
entonces
entonces ok:=falso
ok:=falso
sino
sino j:=j+1
j:=j+1
fsi
fsi
fmq;
fmq;
i:=i+1;
i:=i+1;
fmq;
fmq;
si
si ok
ok
entonces
entonces devuelve
devuelve ii
sino
sino devuelve
devuelve 00
fsi
fsi
fin
fin
J. Campos - C.P.S. Esquemas algorítmicos - Precondicionamiento… Pág. 19
Reconocimiento de patrones:
Método directo
– Peor caso:
Ω(m(n-m))
v Ejemplo:
C = ‘RECONOCIMIENTO’
– Se calcula la firma de Si y de P.
v Comentarios:
– Es un ejemplo de precondicionamiento.
– El cálculo de firmas requiere un tiempo:
u O(n) para S
u O(m) para P
v Otro ejemplo:
S = ‘yyyyyyyyyyyyx’
P = ‘yyyyyx’
v Un ejemplo más:
S = ‘xyyyyxyyxyyyyy’
P = ‘xyyyyy’
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
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
v En el ejemplo anterior:
i = 1 2 3 4 5 6 7 8 9 10 11
P= x y x y y x y x y x x
sig = −1 0 0 1 2 0 1 2 3 4 3
función
función KMP(S,P:cadena;
KMP(S,P:cadena; n,m:natural)
n,m:natural)
devuelve
devuelve natural
natural
{Idéntica
{Idéntica especificación
especificación aa ‘subcadena’.}
‘subcadena’.}
variables
variables i,j,pos:natural
i,j,pos:natural
principio
principio
j:=1;
j:=1; i:=1;
i:=1;
pos:=0;
pos:=0;
mq
mq pos=0 and ii≤≤nn hacer
pos=0 and hacer
si
si P[j]=S[i]
P[j]=S[i]
entonces
entonces
j:=j+1;
j:=j+1;
i:=i+1
i:=i+1
sino
sino
j:=sig[j]+1;
j:=sig[j]+1;
si
si j=0
j=0 entonces
entonces
j:=1;
j:=1;
i:=i+1
i:=i+1
fsi
fsi
fsi;
fsi;
si
si j=m+1
j=m+1 entonces
entonces pos:=i-m
pos:=i-m fsi
fsi
fmq;
fmq;
devuelve
devuelve pospos
fin
fin
i = 1 2 3 4 5 6 7 8 9 10 11
P= x y x y y x y x y x x
sig = −1 0 0 1 2 0 1 2 3 4
u Si pi-1 ≠ psig(i-1)+1:
i = 1 2 3 4 5 6 7 8 9 10 11
P= x y x y y x y x y x x
sig = −1 0 0 1 2 0 1 2 3 4 ?
⇒ sig(11) = 3
J. Campos - C.P.S. Esquemas algorítmicos - Precondicionamiento… Pág. 36
Reconocimiento de patrones:
El algoritmo KMP
tipo
tipo vect
vect == vector[1..m]
vector[1..m] de
de entero
entero
algoritmo
algoritmo calculaSig(ent
calculaSig(ent P:cadena;
P:cadena;
ent
ent m:natural;
m:natural;
sal
sal sig:vect)
sig:vect)
{Cálculo
{Cálculo de
de la
la tabla
tabla ‘sig’
‘sig’ para
para el
el
patrón ‘P’.}
patrón ‘P’.}
variables
variables i,j:natural
i,j:natural
principio
principio
sig[1]:=-1;
sig[1]:=-1;
sig[2]:=0;
sig[2]:=0;
para
para i:=3
i:=3 hasta
hasta mm hacer
hacer
j:=sig[i-1]+1;
j:=sig[i-1]+1;
mq
mq j>0
j>0 and
and entonces P[i-1]≠≠P[j]
entonces P[i-1] P[j] hacer
hacer
j:=sig[j]+1
j:=sig[j]+1
fmq;
fmq;
sig[i]:=j
sig[i]:=j
fpara
fpara
fin
fin
v Descripción:
– Como en KMP, desplazamos P sobre S de
izquierda a derecha examinando los caracteres
enfrentados.
– Pero ahora la verificación de los caracteres de P
se hace de derecha a izquierda después de cada
desplazamiento del patrón.
– Se utilizan dos reglas para decidir el
desplazamiento que hay que hacer después de
una discrepancia:
Regla A. Después de un desplazamiento, se com-
para pm con un carácter c de S y son distintos:
u Si c aparece más a la izquierda en el patrón,
se desplaza éste para alinear la última apari-
ción de c en el patrón con el carácter c de S.
u Si c no está en P, se coloca éste inmediata-
mente detrás de la aparición de c en S.
Regla B. Si un cierto nº de caracteres al final de P
se corresponde con caracteres de S,
aprovechamos este conocimiento parcial de S
(como en KMP) para desplazar P a una nueva
posición compatible con la información que
poseemos.
v Ejemplo:
S = ‘se espera cielo nublado para mañana’
P = ‘lado’
Lo mismo. Regla A:
S = ‘se espera cielo nublado para mañana’
P= ‘lado’
Lo mismo. Regla A:
v Otro ejemplo:
S = ‘babcbabcabcaabcabcabcacabc’
P = ‘abcabcacab’
– Regla A:
S = ‘babcbabcabcaabcabcabcacabc’
P= ‘abcabcacab’
S = ‘babcbabcabcaabcabcabcacabc’
P= ‘abcabcacab’
– Regla A:
S = ‘babcbabcabcaabcabcabcacabc’
P= ‘abcabcacab’
v Precondicionamiento o preproceso
necesario para implemetar BM:
– El cálculo de d1 es fácil:
– De igual forma:
S = ‘????xte???????’ con x≠n
P = ‘ostente’
Etcétera: d2:=[13,12,11,10,5,8]
S = ‘??virte???????’
P = ‘ostente’
S = ‘??virte???????’
P= ‘ostente’
S = ‘??virte???????’
P= ‘ostente’