1 / 42

UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA

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

junius
Download Presentation

UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. UNIVERSITA’ DI MILANO-BICOCCALAUREA MAGISTRALE IN BIOINFORMATICA Corso di BIOINFORMATICA: TECNICHE DI BASE Prof. Giancarlo Mauri Lezione5 Algoritmi di string matching esatto

  2. 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

  3. 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}

  4. 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

  5. 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

  6. 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?

  7. 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

  8. 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

  9. 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]

  10. 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]

  11. 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

  12. 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]

  13. 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

  14. 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

  15. 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

  16. 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)

  17. 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

  18. 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]

  19. 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]

  20. Algoritmo di Boyer-Moore Intuitivamente... Dato che esiste un j (1jm) per cui P[j]  T[s+j], trovare il massimo k(1km), se esiste, tale che: P[k] = T[s+j] e spostare P in s’+1 tale che s'+k = s+j

  21. 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: 1km e P[k] = si} NB:s(i) è l’i-esimo simbolo dell’alfabeto S

  22. 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...

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

  28. 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

  29. 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]

  30. 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]

  31. 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

  32. 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]}

  33. 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

  34. 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

  35. 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

  36. 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

  37. 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

  38. 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

  39. 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*/

  40. 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

  41. 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

  42. 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

More Related