Corrispondenza fra stringhe Lezione n°19 Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi ASD a.a.2010/2011- Lezione 19 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.2010/2011- Lezione 19 Suffissi e Prefissi Una stringa w è un prefisso (suffisso) di una stringa x,w x (w x), se x=wy (x=yw), per qualche stringa y in ∑* (w ≤ x ) Vale: è sia prefisso che suffissso di ogni stringa;sia che sono relazioni transitive; w x sess wa xa, per qualunque carattere a (lo stesso vale per ) Lemma: siano x,y e z stringhe tali che x z e y z, allora 1. x y, se x < y 2. y x, se y < x 3. 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.2010/2011- Lezione 19 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.2010/2011- Lezione 19 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.2010/2011- Lezione 19 caratteri e cifre Ogni carattere è una cifra decimale; ovvero ∑ = {0,1,2…9}, quindi una stringa di k caratteri consecutivi si può leggere come un numero decimale di lunghezza k (in generale si può assumere che ogni carattere sia una cifra in base d =∑ p: corrispondente valore decimale del pattern P [1,…,m] (p = ∑ P [j]10j ) ts: corrispondente valore decimale della sottostringa 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.2010/2011- Lezione 19 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.2010/2011- Lezione 19 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.2010/2011- Lezione 19