Stringhe e spostamenti Lezione n°20 Prof.ssa Rossella Petreschi Lezione del 7/1/2014 del Corso di Algoritmica
Ricerca del pattern nel testo Definizioni: ∑* : l’insieme di tutte le stringhe di lunghezza finita formate usando caratteri dell’alfabeto ∑ (si considerino solo stringhe di lunghezza finita) x : dimensione della stringa x 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. Siano date T[1,…,n] e P [1,…,m] stringhe di caratteri prese da un alfabeto finito ∑; chiamiamo T testo e P pattern. Problema (formulazione 1): trovare tutte le occorrenze di P all’interno di T Esempio: T = abcabaabcabac, P = abaa, P appare una sola volta in T 2
Ricerca degli spostamenti validi Definizioni: s è uno spostamento valido per T (ovvero P appare con spostamento valido s) se T[s+1,…,s+m]= P[1,…,m] Problema (formulazione 2): trovare tutti gli spostamenti validi con cui un dato pattern P appare in un dato testo T. Esempio: T = abcabaabcabac, P = abaa, P appare in T con un solo spostamento valido pari a 3 3
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 suf z e y suf z, allora x suf y, se x < y y suf x, se y < x y = x, se y = x Problema (formulazione 3): trovare tutti gli spostamenti s, 0≤s≤n-m, tali che P sia suffisso di Ts+m Esempio: T = abcabaabcabac, P = abaa, Ts+m = abcabaa 4
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 Esempio: Siano T= acaabc e P=aab; Per s= 0 P è confrontato con T[1,…,3] Per s= 1 P è confrontato con T[2,…4] Per s= 2 P è confrontato con T[3,…,5] unico caso in cui vale l’uguaglianza Per s= 3 P è confrontato con T[4,…,6] 5
Complessità dell’ algoritmo Naif Tempo computazionale: ((n-m+1)m) Si noti che: il tempo di pre-elaborazione è nullo; il tempo((n-m+1)m) è stretto, ovvero può essere effettivamente raggiunto (p.e.si pensi a T=an e P = am); il tempo((n-m+1)m) è O(n2), quando m è dell’ordine di n/2. NOTA: il difetto di questo algoritmo sta nel non sfruttare il lavoro che si fa man mano che si considera un nuovo spostamento. 6
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)…) Es: 1251 = ∑ ajxj (j= 0,…,3) = a0+10(a1+10(a2+10a3)) = 1+10(5+10(2+10x1)) = = 1 +10 (5+10x12) = 1+10x125 = 1251 Classe di congruenza modulo n : [a]n= {a+kn: Z∍k} Es. [3]7= {…, -11,-4,3,10,17,…} = [-4]7= [10]7=… 7
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 di lunghezza m 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])…) 8
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] Es: Sia T=31415276; m=5; t0=31415. prima si sottrae la cifra più significativa da ts (-10m-1T[s+1]) (nell’esempio 3): 31415 – 3 x 104 = 1415 poi si trasla ilnumero di una posizione a sx (moltiplicazione per10) : 1415 x 10 = 14150 infine si inserisce l’appropiata cifra meno significativa (+ T[s+m+1]): 14150 + 2 =14152 Il calcolo delle potenze del 10 si può effettuare a priori in tempo O(m). 9
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 Preelaborazione O(m) p e t0 si calcolano in O(m) tempo le potenze di 10 si calcolano a priori in tempo O(m). Elaborazione(matching) O(m (n-m+1)) tutti gli (n-m) ts si calcolano in tempo costante uno dall’altro Problema: Se le dimensioni di P sono grandi, è irragionevole pensare che ogni operazione aritmetica sia costante 10
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. 11
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(u + n/q)) con u = numero degli spostamenti validi 12
Esempio Sia T = 2 3 5 9 0 2 3 1 4 1 5 2 6 7 3 9 9 2 1 e P = 31415 = [7]13 Per s= 6, P è confrontato con T[7,…,11]= 31415 = [7]13 Per s= 7, P è confrontato con T[8,…,12]= 14152 = [8]13 Per s= 12, P è confrontato con T[13,…,17]= 6739921 = [7]13 s =6 è uno spostamento valido, s = 12 non è uno spostamento valido. 13
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. è un alfabeto di input finito. è una funzione da Qx 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 14
Automi e stringhe Per un automa di corrispondenza fra stringhe relativo ad un dato pattern P [1,…,m] si ha Q = (0,1,…m), l’insieme finito degli stati. lo stato iniziale q0 in Q è 0. l’unico stato accettante di A in Q è m. è un alfabeto di input finito. d , funzione di transizione da Qx in Q, è così definita d(q,a) = s(Pqa), per ogni q in Q e a in 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 15
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) 16
Esempio Dato il Pattern P =ababaca con caratteri sull’alfabeto (a,b,c), l’automa corrispondente è definito dalla seguente tabella: Q a b c 0 1 0 0 1 1 2 0 2 3 0 0 3 1 4 0 4 5 0 0 5 1 4 6 7 0 0 1 2 0 17
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) 18