420 likes | 606 Views
UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA. Corso di BIOINFORMATICA: TECNICHE DI BASE Prof. Giancarlo Mauri Lezione 5 Algoritmi di string matching esatto. Exact matching: il problema. DATE : una stringa T di lunghezza n (detta testo ) e
E N D
UNIVERSITA’ DI MILANO-BICOCCALAUREA MAGISTRALE IN BIOINFORMATICA Corso di BIOINFORMATICA: TECNICHE DI BASE Prof. Giancarlo Mauri Lezione5 Algoritmi di string matching esatto
Exact matching: il problema DATE: una stringa T di lunghezza n (detta testo) e una stringa P di lunghezza m<n (detta pattern) definite su un alfabeto S TROVARE: l’ insieme di tutte le posizioni nel testo T a partire da cui occorre il pattern P
Exact matching: il problema Esempio Algoritmo di exact matching P=aba T=bbabaxababay NB: le occorrenze di P in T possono anche sovrapporsi (es. 7 e 9) {3,7,9}
Exact matching: prime idee Algoritmo “forza bruta” • Allinea il primo carattere di P con il primo carattere di T • Confronta, da sinistra a destra, i caratteri corrispondenti di P e T fino a quando trovi un mismatch o raggiungi la fine di P • Se hai raggiunto la fine di P, restituisci la posizione del carattere di T che corrisponde al primo carattere di P • Sposta P di un posto a destra • Se l’ultimo carattere di P va oltre la fine di T, termina l’esecuzione; altrimenti ripeti da 2
x a b x y a b x y a b x z T a b x y a b x z a b x y a b x z a b a b x a y b x a x y a y b b a x x b z z x z a b x y a b x z a a b x b x y y a b a x b z x z Exact matching: prime idee • Se hai raggiunto la fine di P, restituisci la posizione del carattere di T che corrisponde al primo carattere di P => 6 • Allinea il primo carattere di P con il primo carattere di T • Confronta, da sinistra a destra, i caratteri corrispondenti di P e T fino a quando trovi un mismatch o raggiungi la fine di P • Sposta P di un posto a destra • Confronta, da sinistra a destra, i caratteri corrispondenti di P e T fino a quando trovi un mismatch o raggiungi la fine di P • Sposta P di un posto a destra • Sposta P di un posto a destra... • Sposta P di un posto a destra • Confronta, da sinistra a destra, i caratteri corrispondenti di P e T fino a quando trovi un mismatch o raggiungi la fine di P • Confronta, da sinistra a destra, i caratteri corrispondenti di P e T fino a quando trovi un mismatch o raggiungi la fine di P • L’ultimo carattere di P va oltre la fine di T. Termina l’esecuzione Esempio T = xabxyabxyabxz P = abxyabxz P
Exact matching: prime idee Caratteristiche dell’algoritmo “forza bruta” • Non è necessaria una fase di pre-processing • Il pattern P viene sempre spostato di una posizione a destra • La complessità in tempo è O(nm) NB:non sempre è necessario spostare P di una sola posizione. Come aumentare lo spostamento senza rischiare di perdere occorrenze?
Exact matching: preprocessing Fase di pre-processing per imparare la struttura “interna” del pattern P o del testo T e RIDURRE IL TEMPO DI ESECUZIONE
Exact matching: preprocessing Def.: un suffisso S[i…|S|] di una stringa S è una sottostringa che inizia alla posizione i e termina alla posizione finale di S Esempio S = A A T G C A T T C G C T Def.: un prefissoS[1…i] di una stringa S è una sottostringa che inizia alla posizione 1 di S e termina alla posizione i Esempio S = A A T G C A T T C G C T
a g a g a c a g a c g a g a g a a g c g a t T s k q P Exact matching: preprocessing Si supponga di essere nella seguente situazione con P in s+1 NB: all’interno del matching lungo q=5 esiste la sottostringa P[3..5] = aga che coincide con il prefisso P[1..3]
a g a g a c a g a c g a g a g a a g c g a t T k s’ P s q-k Exact matching: preprocessing E’ evidente che conviene spostare P in s’+1 = s+(q-k)+1 Si supponga di essere nella seguente situazione con P in s NB: si è così sicuri che esiste un matching iniziale di lunghezza k=3 per il prefisso P[1..3] NB: all’interno del matching lungo 5 esiste la sottostringa P[3..5]=“aga” che coincide con il prefisso P[1..3]
Exact matching: preprocessing Intuitivamente... Dato che il prefisso P[1...q] coincide con la sottostringa T[s+1…s+q], ci si chiede quale sia il minimo spostamento s’>s tale che: P[1...k] = T[s'+1…s'+k] Ovviamente s’ = s+q-k NB:il confronto dei primi k caratteri di P è superfluo
q m k 1 Exact matching: preprocessing Formalmente... Dato un pattern P[1, …, m], si calcola la sua funzione prefisso : {1,2,...,m} {0,1,...,m-1} [q] = max{k: k<q e P[1..k]è suffisso di P[1..q]} NB:p[q] è la lunghezza del più lungo prefisso di P che è anche suffisso di P[1..q]
Exact matching: preprocessing Algoritmo per il calcolo della funzione prefisso p begin m:=length(P); p(1):=1; k:=0; for q:=2 to m do begin while P[k+1]P[q] do k:=p[k]; if P[k+1]=P[q] then k:=k+1; p[q]:=k; end return p; end
g 1 0 0 a 2 c 3 0 4 g 1 2 5 a 6 1 g 7 a 2 1 g 8 9 a 2 10 a a 1 g 11 c 12 0 g 13 1 2 a 14 15 0 t q P[q] p[q] Exact matching: preprocessing Esempio di funzione prefisso p per un pattern P
Algoritmo di Knuth-Morris-Pratt Algoritmo di Knuth-Morris-Pratt begin n:= length(T); m:=length(P); p:= precomputed prefix functionof P; q:=0; for i:=1 to n do begin while q>0 and P[q+1]T[i] then q:=p[q]; if P[q+1]=T[i] then q:=q+1; if q=m then print “pattern in i-m+1”; q:=p[q]; end end Numero di matches Scansione da sx a dx Il prossimo carattere è diverso Il prossimo carattere è uguale Trovata occorrenza di P Cerca nuova occorrenza
Complessità algoritmo K-M-P: O(m+n) Algoritmo di Knuth-Morris-Pratt Caratteristiche dell’algoritmo KMP • E’ suddiviso in due fasi: pre-processing + ricerca effettiva • Sposta in genere il pattern P di più posizioni a destra • La complessità in tempo della fase di pre-processing è O(m) • La complessità in tempo della fase di ricerca è O(n)
Algoritmo di Boyer-Moore Idee generali • Il confronto tra il pattern e il testo avviene da destra a sinistra • Il numero dei confronti viene ridotto usando due euristiche • euristica del carattere discordante (bad character rule) • euristica del buon suffisso (good suffix rule) NB: quando pattern e testo non coincidono si sceglie il massimo tra gli spostamenti proposti dalle due euristiche
a g a g a c a g a c g a g a g a a g c g a t T s P j k Algoritmo di Boyer-Moore Si supponga di essere nella seguente situazione con P in s E’ evidente che conviene spostare P in s’+1 = s+1+j-k NB: il carattere P[4] coincide con il carattere T[s+7]
a g a g a c a g a c g a g a g a a g c g a t T s’ k P Algoritmo di Boyer-Moore E’ evidente che conviene spostare P in s’+1 = s+1+j-k NB: il carattere P[4] coincide con il carattere T[s+7]
Algoritmo di Boyer-Moore Intuitivamente... Dato che esiste un j (1jm) per cui P[j] T[s+j], trovare il massimo k(1km), se esiste, tale che: P[k] = T[s+j] e spostare P in s’+1 tale che s'+k = s+j
Algoritmo di Boyer-Moore Formalmente... Dato un pattern P, si trova la funzione carattere discordante l: l:{s1, s2,..., s|S|} {1,2,...,m} l[si] = max{k: 1km e P[k] = si} NB:s(i) è l’i-esimo simbolo dell’alfabeto S
Algoritmo di Boyer-Moore Algoritmo per il calcolo della funzione carattere discordante l begin m:=length(P); foreachs in Sdo l[s]:=0; for j:=1 to m do l[P[j]]:=j; returnl; end Si verificano 3 casi...
a t a t a c a g a c g a g a g a a g c g a t T s P Algoritmo di Boyer-Moore Euristica del carattere discordante CASO 1: il carattere discordante non appare nel pattern P g
a t a t a c a g a c g a g a g a a g c g a t T s+6 P Algoritmo di Boyer-Moore Euristica del carattere discordante CASO 1: il carattere discordante non appare nel pattern P lo spostamento è tale da allineare il primo carattere di P con il carattere di T successivo al carattere discordante
a t g t a c a g a c g a g a g a a g c g a t T s P Algoritmo di Boyer-Moore Euristica del carattere discordante CASO 2: l’occorrenza più a destra in P del carattere discordante è in una posizione k minore dell’indice j che corrisponde al carattere di P allineato con il carattere discordante g g
a t g t a c a g a c g a g a g a a g c g a t T g s+3 P g Algoritmo di Boyer-Moore Euristica del carattere discordante CASO 2:l’occorrenza più a destra in P del carattere discordante è in una posizione k minore dell’indice j che corrisponde al carattere di P allineato con il carattere discordante lo spostamento è tale da allineare P[k] con il carattere discordante in T
a t g t a c g g a c g a g g c g a g c g a t T s P Algoritmo di Boyer-Moore Euristica del carattere discordante CASO 3: l’occorrenza più a destra in P del carattere discordante è in una posizione k maggiore dell’indice j che corrisponde al carattere di P allineato con il carattere discordante g g
a t g t a c g g a c g a g g c g a g c g a t T s+1 P Algoritmo di Boyer-Moore Euristica del carattere discordante CASO 3: l’occorrenza più a destra in P del carattere discordante è in una posizione k maggiore dell’indice j che corrisponde al carattere di P allineato con il carattere discordante g g si può solo effettuare lo spostamento di un posto a destra
a a c g a c g g a c g a g a c a c g c g a t T s P j k Algoritmo di Boyer-Moore Si supponga di essere nella seguente situazione con P in s E’ evidente che conviene spostare P in s’ NB: la sottostringa P[2..5] coincide il suffisso P[5..7] e quindi con la sottostringa T[s+5..s+7]
a a c g a c g g a c g a g a c a c g c g a t T s’ k P Algoritmo di Boyer-Moore Si supponga di essere nella seguente situazione con P in s E’ evidente che conviene spostare P in s’ NB: la sottostringa P[2..5] coincide il suffisso P[5..7] e quindi con la sottostringa T[s+5..s+7] NB: si è così sicuri che esiste un matching per la sottostringa P[2..5]
Algoritmo di Boyer-Moore Intuitivamente... Dato che il suffisso P[j+1, m] coincide con la sottostringa T[s+j+1, s+m], occorre trovare, se esiste,la posizione k<j più a destra tale che: P[k] P[j] P[k+1, k+m-j] = T[s+j+1, s+m] e spostare P in s’+1 tale che s'+k = s+j NB: il confronto dei caratteri di P da k a k+m-j è superfluo
Algoritmo di Boyer-Moore Formalmente... Dato un pattern P, si trova la funzione suffisso g: g: {0,1,...,m-1} {0,1,...,m-1} g[j] = max{k: k<j+1, P[j+1,...,m]suffisso di P[1..g[j]+m-j] e P[k] P[j]}
Algoritmo di Boyer-Moore Algoritmo per il calcolo della funzione suffisso g begin m:=length(P); P’:=inverso(P); :=funzione prefisso di P; //come KMP ’:=funzione prefisso di P’; //come KMP for j:=0 to m do [j]:=m-[m]; for l:=1 to m do begin j:=m-’[l]; if [j] > l - ’[l] then [j]:=l-’[l]; end return end
Algoritmo di Boyer-Moore Euristica del buon suffisso CASO 1: k non esiste • si sposta P fino a far coincidere un suo prefisso con un suffisso di T[s+j+1..s+m], o di m passi se nessun prefisso di P è suffisso di T[s+j+1..s+m] CASO 2: k esiste • si sposta P fino del numero minimo di passi per far coincidere un suo prefisso proprio con un suffisso dell’occorrenza di P in T, o di m passi se questo non esiste
a a c g a c g g a c g a g a c a c g c g a t T s P Algoritmo di Boyer-Moore Euristica del buon suffisso + Euristica del carattere discordante (esempio) c c l’euristica del carattere discordante genererebbe uno spostamento in s+1
a a c g a c g g a c g a g a c a c g c g a t T s+1 P c Algoritmo di Boyer-Moore Euristica del buon suffisso + Euristica del carattere discordante (esempio) c l’euristica del carattere discordante genererebbe uno spostamento in s+1
a a c g a c g g a c g a g a c a c g c g a t T s P Algoritmo di Boyer-Moore Euristica del buon suffisso + Euristica del carattere discordante (esempio) l’euristica del buon suffissso genererebbe uno spostamento in s+4
a a c g a c g g a c g a g a c a c g c g a t T s+4 P Algoritmo di Boyer-Moore Euristica del buon suffisso + Euristica del carattere discordante (esempio) l’euristica del buon suffissso genererebbe uno spostamento in s+4 che risulta essere lo spostamento da effettuare l’euristica del buon suffissso genererebbe uno spostamento in s+4
Algoritmo di Boyer-Moore n:=length(T); m:=length(P); :=BadCharacterRule(P); :=GoodSuffixRule(P); s:=0; while s ≤ n-m do begin j:=m; while j > 0 and P[j] = T[s+j] do j:=j-1; if j = 0 then stampa(“pattern in posizione s+1”); s:=s+[0]; else s:=s+max([j], j-[T[s+j]]); end /*Pre-processing*/ /*Scansione da destra*/ /*Proposta euristiche*/
s + 4 a c m i n i u l c n l c s + 3 Exact Matching: algoritmo di Boyer-Moore Car. discordante Buon suffisso ... ... s s non valido proposta del car. discordante proposta del buon suffisso Proposta vincente: carattere discordante
Algoritmo di Boyer-Moore Caratteristiche dell’algoritmo BM • E’ suddiviso in due parti: pre-processing + ricerca effettiva • Sposta in genere il pattern P di più posizioni a destra • La fase di pre-processing è basata su due euristiche • Funziona “bene” se il pattern P è relativamente lungo e se l’alfabeto |S| è ragionevolmente grande
Algoritmo di Boyer-Moore Caratteristiche dell’algoritmo BM • La complessità in tempo della fase di pre-processing è O(|S|+m)+O(m)=O(|S|+m) • La complessità in tempo della fase di ricerca è O(n-m+1)m=O(nm) • La complessità in tempo di BM è O(nm) NB: nella pratica è più efficiente