New String Matching - EXACTAS UNICEN · 2009. 10. 21. · Knuth-Morris-Pratt O(m) O(n) Boyer-Moore...

Post on 15-Oct-2020

7 views 0 download

Transcript of New String Matching - EXACTAS UNICEN · 2009. 10. 21. · Knuth-Morris-Pratt O(m) O(n) Boyer-Moore...

String Matching

Análisis y diseño de algoritmos II

String MatchingEncontrar todas las ocurrencias de un patrón enun texto.

Aplicaciones� Funcionalidad de editores de texto� Patrones en secuencias de ADN

a b c a b a a b c a

a b a a

b a cTexto

Patrón

String Matching

El texto y el patrón están definidos sobre un mismoalfabeto Σ.

El texto es un arreglo de n elementos:T[1..n]El patrón es un arreglo de m elementos (m≤n): P[1..m]Ocurrencia del patrón con desplazamiento s:(∃s: 0≤s≤n-m:(∀j:1≤j≤m:T[s+j]=P[j]))

a b c a b a a b c a

a b a a

b a cTexto

Patrón

String MatchingNotación“w es prefijo de x” (w ⊏ x) si x= w.y (yεΣ*).Si w ⊏ x luego, │w│ ≤ │ x │Ejemplo ab ⊏ abcac“w es sufijo de x” (w ⊐ x) si x = y.wEjemplo cab ⊐ abcabLa notación Pk es equivalente a P[1..k], representa a losk caracteres prefijos de P.Tk representa a los k caracteres prefijo de T.

String MatchingNotationx,y,z: cadenas/ x ⊐ z y y⊐z. Si |x|≤ |y|, luegox⊐y. Si |x| ≥|y|, luego y⊐x. Si |x|=|y| luego x=y

X

Z

Y

X

Y

X

Z

Y

X

Y

X

Z

Y

X

Y

String MatchingUn algoritmo “ingenuo”Encontrar todos los desplazamientos s en el rango 0≤s≤n-m / P⊐Ts+mP ocurre sólo una vez en T, en el desplazamiento s = 2

String MatchingUn algoritmo “ingenuo”STRING-MATCHER (T:Texto; P:Patrón){n = long(T);m= long(P);for (s=0; s <= n-m; s++)if ( P[1..m] == T[s+1..s+m])cout << “Matching con desplazamiento”<<s;

}

String Matching- Algoritmos clásicosTiempo Tiempo

Preprocesamiento MatchingRabin-Karp O(m) O((n - m + 1)m)

Autómata finito O(m |Σ|) O(n)

Knuth-Morris-Pratt O(m) O(n)

Boyer-Moore O(m) O((n-m+1)m+|Σ|

String MatchingAlgoritmo de Rabin-KarpSe basa en nociones elementales de la teoría denúmeros, tal como la equivalencia de dosnúmeros módulo un tercero.

Sugerencia:Consultar los apuntes de Matemática Discreta oCormen, capítulo 31

String MatchingAlgoritmo de Rabin-KarpSupongamos que el alfabeto es

Σ={0,1,2,3,4,5,6,7,8,9}Una cadena de k caracteres consecutivosrepresenta un número decimal de longitud k.Por ejemplo la cadena 31415.En el caso general, asumimos que cada caracteres un dígito en un sistema d-ario, donde d=|∑.

String MatchingAlgoritmo de Rabin-KarpSean P[1..M] y T[1..n] el patrón y texto.

p es el valor decimal de P

ts es el valor decimal de T[s+1..s+m] (0≤s≤ n-m)

ts = p si y sólo sí T[s+1..s+m]=P[1..m]

String MatchingAlgoritmo de Rabin-KarpCálculo de p en O(m) usando la regla de Horner p = P[m]+10(P[m-1]+10(P[m-2]+ …10(P[2]+

10 (P[2] + 10P[1])…))El valor de t0 puede ser calculado desde T[1..m]en O(m). Para calcular t1, t2,…,tn-m en tiempoO(n-m) es suficiente observar que ts+1 puede sercalculado desde ts en un tiempo constante: ts+1= 10(ts -10m-1T[s+1]) + T[s+m+1]

String MatchingAlgoritmo de Rabin-Karpts+1= 10(ts -10m-1T[s+1]) + T[s+m+1]Si m=5 y ts=31415ts+1=10 (31415 -10000.3) +2 = 14152

String MatchingAlgoritmo de Rabin-Karpts+1= 10(ts -10m-1T[s+1]) + T[s+m+1]

Si 10m-1 es precalculada, el cálculo de ts+1 es constante.Luego, p, t0, t1,..tn-m pueden ser calculados en O(n+m). Es decir,todas las ocurrencias de P[1..m] en el texto T[1..n] pueden sercalculadas en O(n+m). Sin embargo, si p y ts son muy grandes nose puede considerar que las operaciones aritméticas sobre p secalculan en tiempo constante. Luego, Rabin y Karp proponentrabajar con módulos de p y ts.

String MatchingAlgoritmo de Rabin-Karp

mod 13

válido inválido

Supongamos que el patrón sea 31415, otras cadenas como 67399 compartenvalores.Trabajar con módulos permite descartar ocurrencias pero no garantizala ocurrencia del patrón.

String MatchingAlgoritmo de Rabin-Karp14152 ≡ (31415 -3. 10000).10 + 2 (mod 13)14152 ≡ (7 – 3.3 ) 10 + 2 (mod 13)≡ 8 mod 13 Recordar!x mod y ≡ x – y x/y-18 mod 13 ≡ -18 -13 -18/13-18 mod 13 ≡ 8 mod 13 ...-18, -5, 8, 21,... son todos “congruentes módulo 13”

7 8

String MatchingAlgoritmo de Rabin-KarpTs+1= (d (ts –T[s+1] h) + T[s+m+1]) mod q

h= dm-1 (mod q)

Sugerencia:Para un alfabeto d-ario elegir un q / d.qpueda almacenarse en una palabra de computadora

String MatchingAlgoritmo de Rabin-Karp

Rabin-Karp-Matcher (T, P, d,q){n=long(T);m= long(P);h= dm-1 (mod q);p = 0; to = 0;for (i=1; i<=m; i++){ p = (d. p + P[i]) (mod q);to = d. t0 + T[i]) (mod q);}for (s=0; s <=n-m; s++){if (p == ts)

if (P[1..m] == T[s+1..s+m] )cout<< “matching con desplazamiento”<< s;

else if (s < n-m) ts+1= (d. (ts –T[s+1].h) + T[s+m+1]) mod q

}}

O((n-m+1)m)

String Matching“Fuerza bruta” vs Rabin-Karp

Tiempo TiempoPreprocesamiento Matching

“Alg. ingenuo” O(1) O((n-m+1) m)Rabin-Karp O(m) O((n - m + 1)m)

Sugerencias� Analizar el comportamiento promedio de Rabin-Karpvs. fuerza bruta� Analizar si es posible adaptar Rabin-Karp para reconocervarios patrones en un mismo proceso.

String Matching basado en Autómata Finito (AF)Para cada patrón P existe un AF. Este autómataes construido en la etapa de preprocesamiento.Si P= ababaca se construiría el siguiente AF: a

a

a

a

ac

b

ba

a

b0 3 541 2 76

a a

b

String Matching basado en AFNotación AFUn autómata finito M se define mediante la tupla<Q,q0,A, ∑, δ > dondeQ es un conjunto finito de estados,q0∈Q, es el estado inicialA⊆Q, conjunto de estados finales∑, alfabeto de entradaδ :Q x ∑->Q es la función de transición φ(ε) = q0 φ(wa)= δ(φ(w),a) (transiciones sobre cadenas)

String Matching basado en AF

a

a

a

ac

b

ba

a

b0 3 541 2 76

a a

b

String Matching basado en AFDefiniciónFunción sufijo correspondiente a un patrónP[1..m] σ : ∑* ->{0,1,…,m}/ σ(x) es la longituddel prefijo más largo de P que es sufijo de x:σ(x) ≡ {k / Pk ⊐ x}

σ(Y)= |Y|X

P

Y

String Matching basado en AFFunción sufijoSi P = abσ(ε) = 0 σ(ccaca) = 1 σ(ccaab) = 2P0 = ε es sufijo de cualquier xDado un patrón P de longitud mσ(x) = m si y sólo sí P ⊐ x.Si x ⊐y, luego σ(x) ≤ σ(y)

String Matching basado en AFDefinición del AF para P[1..m]Q es {0,1,…,m}q0 es 0A ={m}δ(q,a) = σ(Pqa)El AF mantiene invariante las transicionesφ(Ti) = σ(Ti)

String Matching basado en AFFINITE-AUTOMATON-MATCHER(T, δ,m){n = long(T);q = 0;for (i=1; i<=n;i++){q = δ(q, T[i]);if (q == m) {s = i-m; cout<<“Matching con desplazamiento”<< s;

}}

String Matching basado en AFCOMPUTE-TRANSITION-FUNCTION(P,Σ)1 {m = long (P);2 for (q=0;q<=m;q++)3 for cada caracter a∈∑4 {k = min (m+1, q+2);5 repeat 6 k=k-17 until Pk ⊐ Pqa8 δ(q,a) = k;

}}

String Matching basado en AFEjemplo P = ababaaa

m=7 (1) q=0 (2)Símbolo ak=min(8,2)=2 (4)k=1 (5)P1 ⊐ P0a

δ(0,a)=1

m=7 (1) q=0 (2)símbolo bk=min(8,2)=2 (4)k=1 (5)P1 ⊐ P0b

δ(0,b)=0

String Matching basado en AF

a

a

a

ac

b

ba

a

b0 3 541 2 76

a a

b

String Matching basado en AFComplejidad temporal

O(m |∑|(m+1)m)# caracteres del patrón#iteraciones repeat

O(m3 |∑|)

String MatchingAlgoritmo de Knuth-Morris-PrattSe basa en un pre-procesamiento del patrón queevita el cálculo de la función de transición δusando una función prefijo para patrones πprecalculada desde el patrón.Informalmente, para cada q=0,1,…,m ycualquier a∈∑, π[q] contiene la información quees independiente de a y necesaria para calcularδ(q,a).

String MatchingAlgoritmo de Knuth-Morris-Pratt

s

q

T

P

s’ = s +2

k Pq

Pk

Si se logró un matching de q=5 símbolos con desplazamiento s, se sabe que podrían coincidir símbolos con desplazamiento s+2 y no en s+1

Basta preprocesar el patrón!

T[s+1..s+q] = P[1..q]

String MatchingAlgoritmo de Knuth-Morris-PrattTeniendo en cuenta que P[1..q] = T[s+1..s+q],cuál es el menor desplazamiento s’ > s tal queP[1..k] = T[s+1..s’+k], donde s’+k = s+q?s’ es el primer desplazamiento que no esinválido. En la mejor situación, s’=s+q y losdesplazamientos s+1, s+2, s+q-1 se excluyen.Esta información puede calcularse comparandoal patrón contra sí mismo!

String MatchingAlgoritmo de Knuth-Morris-Pratt¿Cuál es el menor desplazamiento s’ > s tal queP[1..k] = T[s+1..s’+k], donde s’+k = s+q?

¿Cuál es el mayor k<q / Pk ⊐ Pq? Luego, s’=s +(q-k) es el siguientedesplazamiento potencialmente válido.

String MatchingAlgoritmo de Knuth-Morris-PrattPreprocesamiento del patrón

Dado un patrón P[1..m], la función prefijo delpatrón P es la funciónπ: {1,2,..m}-> {0,1,..m-1}/π[q] = max {k: k < q and Pk ⊐ Pq}

Es decir, π[q] es la longitud del prefijo más largode P que es sufijo de Pq .P ababacaπ 0012301

String MatchingAlgoritmo de Knuth-Morris-Pratt KMP-MATCHER (T,P){ n = long (T);m= long (P);Π=COMPUTE-PREFIX-FUNCTION (P){ q=0;for (i=1;i<=n; i++)while (q >0 and P[q+1] <> T[i]q = Π[q];if (P[q+1] == T[i]) q=q+1;if (q=m) cout <<“matching con desplazamiento”<<i-m;q = Π[q];

}

String MatchingAlgoritmo de Knuth-Morris-Pratt COMPUTE-PREFIX-FUNCTION(P)1 {m= long (P);2 Π(1) = 0;3 k = 0;4 for (q=2;i<=m; q++)5 while (k >0 and P[k+1] <> P[q]6 k =Π[k];7 if (P[k+1] = P[q])8 k=k+1;9 Π[q]= k;10 return Π}

String MatchingAlgoritmo de Knuth-Morris-Pratt

String MatchingAlgoritmo de Knuth-Morris-PrattP= ababababcam=10 (1)π[1]=0 (2)k=0 (3)q=2 (4)π[2]=0 (5,7,8)q=3 (4)k=1 (6)π[3]=1 (8)….. π[4]=2; π[5]=3; π[6]=4; π[7]=5; π[8]=6; π[9]=0; π[10]=1

String MatchingAlgoritmo de Knuth-Morris-PrattComplejidad temporalCompute-Prefix-Function ∈ O(m)Knuth-Morris-Pratt ∈ O(m+n)

Tiempo TiempoPreprocesamiento Matching

Autómata finito O(m | |) O(n)

Knuth-Morris-Pratt O(m) O(n)