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