La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

The Knuth-Morris-Pratt Algorithm Università Ca Foscari di Venezia Dipartimento di Informatica Corso di Laboratorio di Linguaggi Cocco Nicoletta docente:

Presentazioni simili


Presentazione sul tema: "The Knuth-Morris-Pratt Algorithm Università Ca Foscari di Venezia Dipartimento di Informatica Corso di Laboratorio di Linguaggi Cocco Nicoletta docente:"— Transcript della presentazione:

1 The Knuth-Morris-Pratt Algorithm Università Ca Foscari di Venezia Dipartimento di Informatica Corso di Laboratorio di Linguaggi Cocco Nicoletta docente: Cocco Nicoletta Cappellazzo Pietro Cappellazzo Pietro – – Rizzato Andrea Rizzato Andrea – –

2 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 2 Introduzione al problema Dato un testo T (T[1…n]) di lunghezza n e un pattern P (P[1…m]) lungo m, determinare se e dove il pattern occorre nel testo Ricerca esatta T abcabaabcabac abaa s = 3 P

3 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 3 Campi applicativi Potenziamento di applicazioni informatiche Comando trova, trova e sostituisci negli editor di testo, browser Web, … Comandi di sistema (es: grep, egrep, fgrep, … in ambiente Unix)

4 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 4 Campi applicativi Problemi legati alla bioinformatica ricostruzione delle serie lunghe di DNA dai suoi frammenti (fragment assembly); confronto di due o più stringhe di DNA per somiglianza; ricerca di modelli nuovi o mal definiti che occorrono frequentemente in DNA; ricerca dei modelli strutturali in DNA e proteina;

5 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 5 Knuth-Morris-Pratt: Intuizione Idea di base: Per avere un algoritmo di ricerca più efficiente occorre separare il procedimento di ricerca in due fasi: Preprocessing: elaborazione preliminare del pattern dalla quale si ricavano informazioni che verranno utilizzate nella seconda fase Scanning: scansione veloce del testo

6 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 6 Knuth-Morris-Pratt: Intuizione AGCAGCT GACGAGCAGAGCGAC T P s q P è allineato con T, in modo tale che P[1…q] = T[s+1…s+q] La conoscenza di questi q caratteri consente di determinare immediatamente che certi spostamenti (s+1 e s+2) non sono validi

7 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 7 La funzione prefisso Dato un pattern P[1..m], la funzione prefisso per il pattern P è la funzione :{1,..,m} {0,..,m-1} t.c. [i]= max{k:k

8 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 8 La funzione prefisso pseudocodice 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P)

9 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 9 Esempio di calcolo della funzione prefisso 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) bbba Pattern P: m = 4 π[1] = 0 k = 0 q = 2 Variabili: 1 0 Funzione Prefisso π i π[i]

10 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 10 Esempio di calcolo della funzione prefisso 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) bbba bbba k+1 = 1 q = 2 k = 0+1 = 1 q = 2 Variabili: ?=?= Funzione Prefisso π i π[i]

11 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 11 Esempio di calcolo della funzione prefisso 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) bbba bbba k+1 = 2 q = 3 k = 1+1 = 2 q = 3 Variabili: ?=?= Funzione Prefisso π i π[i]

12 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 12 Esempio di calcolo della funzione prefisso 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) bbba bbba k+1 = 3 q = 4 ?=?= Funzione Prefisso π i π[i] P[3] P[4] Entro nel while

13 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 13 Esempio di calcolo della funzione prefisso 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) bbba bbba k+1 = 2 q = 4 ?=?= Funzione Prefisso π i π[i] Percorro il pattern allindietro fino a trovare il primo spostamento valido

14 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 14 Esempio di calcolo della funzione prefisso 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) bbba bbba k+1 = 1 q = 4 ?=?= Funzione Prefisso π i π[i] Sono tornato allinizio: lunico spostamento valido è 0

15 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 15 Analisi del tempo computazionale 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) } O(1) O(m) Il costo del ciclo for (linea 4) è O(m) Il valore della funzione potenziale dipende da k La linea 6 decrementa il valore di k perché π[k]

16 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 16 Analisi del codice 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) k rappresenta uno spostamento valido Il caso base (π[1] = 0) è garantito dalle linee 2-3 Il valore di k allinizio di ogni iterazione del ciclo for è uguale a π[q-1] Tale condizione rimane vera nelle successive iterazioni grazie alle linea 9

17 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 17 Analisi del codice 1. m length[P] 2. π[1] 0 3. k 0 4. for q 2 to m 5. do while k>0 e P[k+1] P[q] 6. do k π[k] 7. if P[k+1] = P[q] 8. then k k+1 9. π[q] k 10. return π Compute-Prefix-Function(P) Le linee 5-8 fanno sì che k diventi il valore corretto di π[q] Il ciclo alle linee 5-6 cerca tra tutti gli spostamenti calcolati in π uno per cui P[k+1] = P[q] A questo punto k è lo spostamento cercato Se un tale valore non viene trovato, k=0 alle linee 7-9 e a π[q] è assegnato 0

18 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 18 Algoritmo Knuth-Morris-Pratt Sfruttando la funzione di prefisso si può definire un algoritmo con queste caratteristiche: Legge il testo un carattere alla volta senza ritornare indietro Il pattern non viene sempre riletto dallinizio

19 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 19 Algoritmo Knuth-Morris-Pratt Pseudocodice KMP-Matcher(T,P) 1 n lenght[T] 2 m lenght[P] C OMPUTE -P REFIX -F UNCTION (P) 4 q 0 5 for i 1 to n 6 do while q>0 e P[q+1]T[i] 7 do q [q] 8 if P[q+1]=T[i] 9 then q q+1 10 if q=m 11 then stampa Il pattern appare con spostamento i-m 12 q [q]

20 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 20 Algoritmo Knuth-Morris-Pratt Esempio di applicazione KMP-Matcher(T,P) 1 n lenght[T] 2 m lenght[P] C OMPUTE -P REFIX -F UNCTION (P) 4 q 0 bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=0 Testo = Pattern = bbba

21 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 21 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=0 1 i=1 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q]

22 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 22 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=1 2 i=2 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q]

23 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 23 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=2 3 i=3 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q]

24 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 24 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=3 4 i=4 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q]

25 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 25 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=4 i=4 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q] Il pattern appare con spostamento 0 Output q = [4] = 0 Aggiornamento di q

26 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 26 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=0 1 i=5 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q] Il pattern appare con spostamento 0 Output

27 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 27 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=1 2 i=6 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q] Il pattern appare con spostamento 0 Output

28 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 28 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=2 3 i=7 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q] Il pattern appare con spostamento 0 Output

29 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 29 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=3 [3] 2 i=8 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q] Il pattern appare con spostamento 0 Output

30 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 30 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=2 3 i=8 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q] Il pattern appare con spostamento 0 Output

31 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 31 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=3 4 i=9 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q] Il pattern appare con spostamento 0 Output

32 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 32 Algoritmo Knuth-Morris-Pratt Esempio di applicazione bbbabbbba Variabili: n=9 m=4 =[0,1,2,0] q=4 i=9 Testo = Pattern = bbba 5. for i 1 to n 6. do while q>0 e P[q+1]T[i] 7. do q [q] 8. if P[q+1]=T[i] 9. then q q if q=m 11. then stampa … i-m 12. q [q] Il pattern appare con spostamento 0 Output Il pattern appare con spostamento

33 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 33 Algoritmo Knuth-Morris-Pratt Analisi della complessità computazionale KMP-Matcher(T,P) 1 n lenght[T] 2 m lenght[P] C OMPUTE -P REFIX -F UNCTION (P) 4 q 0 5 for i 1 to n 6 do while q>0 e P[q+1]T[i] 7 do q [q] 8 if P[q+1]=T[i] 9 then q q+1 10 if q=m 11 then stampa … i-m 12 q [q] O(n) La chiamata alla funzione esterna C OMPUTE -P REFIX - F UNCTION ha un costo O(m) come visto in precedenza. Il costo del ciclo for (linea 5) è O(n), lineare rispetto alla lunghezza del testo. O(m)

34 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 34 Algoritmo Knuth-Morris-Pratt Analisi della complessità computazionale KMP-Matcher(T,P) 1 n lenght[T] 2 m lenght[P] C OMPUTE -P REFIX -F UNCTION (P) 4 q 0 5 for i 1 to n 6 do while q>0 e P[q+1]T[i] 7 do q [q] 8 if P[q+1]=T[i] 9 then q q+1 10 if q=m 11 then stampa … i-m 12 q [q] O(1) O(n) Il costo ammortizzato delle linee 6-12 è Il tempo effettivo di esecuzione di KMP- Matcher è O(n+m) O(m) }

35 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 35 Algoritmo Knuth-Morris-Pratt Analisi del codice KMP-Matcher(T,P) 1 n lenght[T] 2 m lenght[P] C OMPUTE -P REFIX -F UNCTION (P) 4 q 0 5 for i 1 to n 6 do while q>0 e P[q+1]T[i] 7 do q [q] 8 if P[q+1]=T[i] 9 then q q+1 10 if q=m 11 then stampa … i-m 12 q [q] ( linea 5 )Il ciclo for garantisce che la ricerca avviene in modo lineare (confrontando ogni elemento del testo). ( linee 6,7 )In caso di mismatch si ritorna indietro fino a trovare un prefisso valido (dato dalla funzione prefisso), oppure fino allinizio del pattern.

36 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 36 Algoritmo Knuth-Morris-Pratt Analisi del codice KMP-Matcher(T,P) 1 n lenght[T] 2 m lenght[P] C OMPUTE -P REFIX -F UNCTION (P) 4 q 0 5 for i 1 to n 6 do while q>0 e P[q+1]T[i] 7 do q [q] 8 if P[q+1]=T[i] 9 then q q+1 10 if q=m 11 then stampa … i-m 12 q [q] ( linee 8,9 )Se i caratteri selezionati nel pattern P e nel testo T sono uguali, garantiscono lavanzamento del carattere controllato nel pattern. ( linea 12 )Necessaria per rilevare correttamente le occorrenze di P in T successive alla prima.

37 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 37 Confronto con altri algoritmi Naive (O((n-m+1)m)), soddisfacente se: si vuole trovare solo la prima occorrenza di un pattern e questa ha buona probabilità di trovarsi allinizio del testo. Se si cercano pattern al più di 3-4 caratteri (improbabile per pattern di DNA).

38 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 38 Knuth-Morris-Pratt VS Boyer-Moore KMP:(O(n+m)) complessità sempre lineare adatto a testi con sequenze ripetitive efficiente con pattern corti BM: In media sub-lineare Problemi con stringhe ripetitive Caso peggiore O(n 2 ) In pratica è il più veloce per la maggior parte delle applicazioni

39 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 39 Bibliografia T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introduzione agli algoritmi, Jackson Libri, seconda edizione. pp cap. 34. D. E. Knuth, J. H. Morris and V. R. Pratt. Fast Pattern Matching in Strings. SIAM Jrnl. Comput. 6(2) p Jun M. Régnier Knuth-Morris-Pratt alghorithm: an analysis. INRIA, Jan 1989.

40 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 40 Bibliografia R. Grossi Algoritmi per internet e Web: Ricerca e indicizzazione di testi. Università degli studi di pisa, C. Charras, T. Lecroq Handbook of Exact String Matching Algoritms. A.V. Aho, Algorithms for finding patterns in strings. in Handbook of Theoretical Computer Science, Volume A, Algorithms and complexity, J. van Leeuwen ed., Chapter 5, pp , Elsevier, Amsterdam

41 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm 41 Link utili


Scaricare ppt "The Knuth-Morris-Pratt Algorithm Università Ca Foscari di Venezia Dipartimento di Informatica Corso di Laboratorio di Linguaggi Cocco Nicoletta docente:"

Presentazioni simili


Annunci Google