Corrispondenza fra stringhe Lezione n°18 Prof.ssa Rossella Petreschi Lezione del 16 /01/ 2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 34 del testo T.H.Cormen, C.E.Leiserson, R.L.Rivest “Introduzione agli algoritmi” Edizioni: Jackson libri ASD-A.A.2011/2012 1
Stringhe e spostamenti Siano dati un testo T[1,…,n] e un pattern P [1,…,m] di caratteri presi da un alfabeto finito ∑ (T e P sono anche detti stringhe di caratteri) Problema: trovare tutte le occorrenze di P all’interno di T Diciamo che P appare con spostamento valido s in T se T[s+1,…,s+m]= P[1,…,m] Problema(seconda formulazione): trovare tutti gli spostamenti validi con cui un dato pattern P appare in un dato testo T. Definizioni: ∑* : l’insieme di tutte le stringhe di lunghezza finita formate usando caratteri dell’alfabeto ∑ stringa vuota di lunghezza 0 appartenente a ∑* xy : concatenazione di due stringhe x e y,ovvero creazione di una stringa di lunghezza x + y dove i caratteri di y seguono i caratteri di x. ASD-A.A.2011/2012 2
Prefissi e Suffissi Una stringa w è un prefisso (suffisso) di una stringa x,w pre x (w suf x), se x=wy (x=yw), per qualche stringa y in ∑* (w ≤ x ) Vale: è sia prefisso che suffissso di ogni stringa; sia pre che suf sono relazioni transitive; w suf x sess wa suf xa, per qualunque carattere a (lo stesso per pre) Lemma: siano x,y e z stringhe tali che x pre z e y pre z, allora x y, se x < y y x, se y < x y = x, se y = x Problema(terza formulazione): trovare tutti gli spostamenti s, 0≤s≤n-m, tali che P sia suffisso di Ts+m Pk(Tk) prefisso di k caratteri del pattern (testo) P(T) ASD-A.A.2011/2012 3
Algoritmo naif L’algoritmo naif trova tutti gli spostamenti validi controllando l’uguaglianza fra P [1,…,m] e T[s+1,…,s+m] per ognuno degli n-m+1 possibili valori di s for s = 0 to n-m do if P [1,…,m] = T[s+1,…,s+m] then stampa s Tempo computazionale: ((n-m+1)m) ASD-A.A.2011/2012 4
Nozioni di teoria dei numeri Regola di Horner per la valutazione di un polinomio A(x)=∑ ajxj (j= 0,…,n-1): A(x0)= a0+x0(a1+x0(a2+…+x0(an-2+x0(an-1)…) Classe di congruenza modulo n : [a]n= {a+kn: Z∍k} Es. [3]7= {…, -11,-4,3,10,17,…} = [-4]7= [10]7=… ASD-A.A.2011/2012 5
caratteri e cifre p: corrispondente valore decimale del pattern P [1,…,m] (p = ∑ P [j]10j , j = 1,…,m) ts: corrispondente valore decimale della sottostringa ts = T[s+1,…,s+m], s=0,…,n-m Quindi p si può calcolare in tempo O(m) con la regola di Horner: p= P[m]+10(P[m-1]+10(P[m-2]+…+10(P[2]+10(P[1])…) ASD-A.A.2011/2012 6
Calcolo delle Ts t0 può essere calcolato , come p, con la regola di Horner in tempo O(m) La sequenza t1 , t2...tn-m può essere calcolata in tempo O(n-m) tenuto conto che ts+1 = 10(ts – 10m-1T[s+1])+T[s+m+1] dove prima si sottrae la cifra più significativa da ts (-10m-1T[s+1]), poi si trasla il numero di una posizione a sx (moltiplicazione per10) e infine si inserisce l’appropiata cifra meno significativa (+ T[s+m+1]) Il calcolo delle potenze del 10 si può effettuare a priori in tempo O(m). ASD-A.A.2011/2012 7
Versione base dell’algoritmo di Rabin-Karp Dato che s è uno spostamento valido se e solo se ts = p, tutti gli spostamenti validi si ottengono confrontando p con ogni ts La complessità è pari a O(n+m), dato che: p e t0 si calcolano in O(m) tempo tutti gli (n-m) ts si calcolano in tempo costante uno dall’altro le potenze di 10 si calcolano a priori in tempo O(m). Problema: Se le dimensioni di P sono grandi, è irragionevole pensare che ogni operazione aritmetica sia costante ASD-A.A.2011/2012 8
Se le dimensioni di P sono grandi…… p e tutti i ts si calcolano modulo un appropriato numero q in tempo O(n + m), dato che p, t0 e tutte le ricorrenze possono essere eseguite modulo q Tipicamente come q viene scelto un numero primo tale che 10q sia rappresentabile dentro una parola della macchina e questo consente di eseguire tutti i calcoli in precisione aritmetica singola. In generale con un alfabeto d-ario si ha: ts+1 = (d(ts –T[s+1]h)+T[s+m+1]) modq dove h= dm-1(mod q) è il valore della cifra “1” nella posizione più significativa di una porzione di testo di m cifre e q è scelto in modo che dq sia rappresentabile dentro una parola della macchina. ASD-A.A.2011/2012 9
ma c’è un inconveniente….. VALE tscongruo p(mod q) non implica ts= p tsnon congruo p(mod q) implica ts≠ p QUINDI se ts non congruo p(mod q) allora lo spostamento è non valido se ts congruo p(mod q) allora si deve controllare se P [1,…,m] = T[s+1,…,s+m] TEMPO DI ESECUZIONE nel caso peggiore: ((n-m+1)m) nel caso medio: O(n)+O(m(m + n/q)) ASD-A.A.2011/2012 10
Automi a stati finiti Un automa a stati finiti è una quintupla (Q,q0,A, S,) dove Q è un insieme finito di stati. q0 in Q è lo stato iniziale. A in Q è un insieme distinguibile di stati accettanti. S è un alfabeto di input finito. è una funzione da QxS in Q, chiamata funzione di transizione di M, ovvero (q,a) è il nuovo stato in cui giunge l’automa che era nello stato q dopo aver letto il carattere a. Se lo stato corrente q appartiene ad A, si dice che la macchina M accetta la stringa appena letta, altrimenti l’input letto è rifiutato. Si dice che una macchina accetta una stringa w sess (w) appartiene ad A e la funzione da * a Q si chiama funzione stato finale ed è definita ricorsivamente: () =q0 ; (wa) =((w),a), per w in * e a in ASD-A.A.2011/2012 11
Automi e stringhe Per un automa di corrispondenza fra stringhe relativo ad un dato pattern P [1,…,m] si ha Q , l’insieme finito di stati, è (0,1,…m). lo stato iniziale q0 in Q è 0. l’unico stato accettante di A in Q è m. S è un alfabeto di input finito. d , funzione di transizione da QxS in Q, è così definita d(q,a) = s(Pqa), per ogni q in Q e a in S Con s(Pqa), corrispondenza tra S* e (0,1,…m), che misura il più lungo prefisso del pattern P che è anche suffisso di Pqa s è chiamata funzione suffisso ASD-A.A.2011/2012 12
Idea di base In ogni stato q l’automa ha bisogno solo di conoscere la lunghezza del più lungo prefisso di P che sia suffisso di quanto letto fino a quel momento. Per la funzione suffisso si ha che: - Per un qualunque carattere a e una qualunque stringa x, vale s(xa) ≤ s(x)+1 - Per un qualunque carattere a e una qualunque stringa x, se q = s(x), vale s(xa) ≤ s(Pqa) ASD-A.A.2011/2012 13
Calcolo di d Tempo O(m3 S ) Algoritmo calcola d(P, S) m=lungh(P); ciclo da m for q=0 to m ciclo da S do for ogni a in S al più m-1 do k = min (m+1,q+2) fino ad m confronti repeat k = k-1 until Pk suff Pqa d(q,a) = k ritorna d Tempo O(m3 S ) ASD-A.A.2011/2012 14
Algoritmo stringhe/automi Algoritmo stringhe/automi (T,d,m) n=lungh(T); q=0; for i=1 to n do q = d(q, T(i)) if q=m then s = i-m; write “il pattern appare con spostamento s” Tempo O(n) + calcolo di d Il miglior algoritmo di corrispondenza fra stringhe e automi richiede tempo O (n+mS) ASD-A.A.2011/2012 15
Correttezza dell’algoritmo stringhe/automi TEOREMA: Se è la funzione stato-finale di un automa di corrispondenza tra stringhe per un dato pattern P e T(1,n) è un testo di input per l’automa, allora (Ti)=s(Ti), i=0,…,n Dimostrazione Si procede per induzione Passo base T0 = quindi (T0) = s(T0) = 0 Ipotesi induttiva (Ti) = s(Ti) Si prova che (Ti+1) = s(Ti+1) (Ti+1) = (Tia) = ((Ti),a) = (q,a) = s(Pq,a) = s(Ti,a) s(Ti+1) ASD-A.A.2011/2012 16