La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

The Knuth-Morris-Pratt Algorithm

Presentazioni simili


Presentazione sul tema: "The Knuth-Morris-Pratt Algorithm"— Transcript della presentazione:

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

2 Introduzione al problema
“Ricerca esatta” 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 1 2 3 4 5 6 7 8 9 10 11 12 13 a b c T s = 3 P a b Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

3 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
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) Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

4 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
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; 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 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

6 Knuth-Morris-Pratt: Intuizione
G A C s A G C T P 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 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 p:{1,..,m} →{0,..,m-1} t.c. p[i]= max{k:k<q &PK PQ} P: PQ: PK: p[q] è la lunghezza del prefisso più lungo di P che è anche un suffisso di PQ A G C T A G C i 1 2 3 4 5 6 7 P[i] A G C T p[i] A G C Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

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

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

10 Esempio di calcolo della funzione prefisso
k+1 = 1 Compute-Prefix-Function(P) m ← length[P] π[1] ← 0 k ← 0 for q ← 2 to m do while k>0 e P[k+1] ≠ P[q] do k ← π[k] if P[k+1] = P[q] then k ← k+1 π[q] ← k return π b a ? = b a q = 2 Variabili: k = 0+1 = 1 q = 2 Funzione Prefisso π 1 2 i π[i] Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

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

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

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

14 Esempio di calcolo della funzione prefisso
k+1 = 1 Compute-Prefix-Function(P) m ← length[P] π[1] ← 0 k ← 0 for q ← 2 to m do while k>0 e P[k+1] ≠ P[q] do k ← π[k] if P[k+1] = P[q] then k ← k+1 π[q] ← k return π b a ? = b a q = 4 Sono tornato all’inizio: l’unico spostamento valido è 0 Funzione Prefisso π 1 2 3 4 i π[i] Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

15 Analisi del tempo computazionale
Compute-Prefix-Function(P) m ← length[P] π[1] ← 0 k ← 0 for q ← 2 to m do while k>0 e P[k+1] ≠ P[q] do k ← π[k] if P[k+1] = P[q] then k ← k+1 π[q] ← k return π O(m) } O(1) 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]<k La linea 8 incrementa il di k al più di 1 Il costo ammortizzato delle linee 5-9 è quindi 1 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

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

17 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
Analisi del codice Compute-Prefix-Function(P) m ← length[P] π[1] ← 0 k ← 0 for q ← 2 to m do while k>0 e P[k+1] ≠ P[q] do k ← π[k] if P[k+1] = P[q] then k ← k+1 π[q] ← k return π 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 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 dall’inizio Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

19 Algoritmo Knuth-Morris-Pratt Pseudocodice
KMP-Matcher(T,P) nlenght[T] mlenght[P] p COMPUTE-PREFIX-FUNCTION(P) q0 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “Il pattern appare con spostamento” i-m qp[q] Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

20 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
KMP-Matcher(T,P) nlenght[T] mlenght[P] p COMPUTE-PREFIX-FUNCTION(P) q0 Testo = Pattern = b a b a Variabili: n=9 m=4 p=[0,1,2,0] q=0 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

21 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a b a Variabili: n=9 m=4 p=[0,1,2,0] q=0  1 i=1 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

22 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a b a Variabili: n=9 m=4 p=[0,1,2,0] q=1  2 i=2 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

23 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a b a Variabili: n=9 m=4 p=[0,1,2,0] q=2  3 i=3 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

24 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a b a Variabili: n=9 m=4 p=[0,1,2,0] q=3  4 i=4 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

25 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a Variabili: n=9 m=4 p=[0,1,2,0] q=4 i=4 b a for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Output Il pattern appare con spostamento 0 Aggiornamento di q q = p[4] = 0 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

26 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a Variabili: n=9 m=4 p=[0,1,2,0] q=0  1 i=5 b a for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Output Il pattern appare con spostamento 0 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

27 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a Variabili: n=9 m=4 p=[0,1,2,0] q=1  2 i=6 b a for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Output Il pattern appare con spostamento 0 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

28 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a Variabili: n=9 m=4 p=[0,1,2,0] q=2  3 i=7 b a for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Output Il pattern appare con spostamento 0 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

29 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a Variabili: n=9 m=4 p=[0,1,2,0] q=3  p[3]  2 i=8 b a for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Output Il pattern appare con spostamento 0 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

30 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a Variabili: n=9 m=4 p=[0,1,2,0] q=2  3 i=8 b a for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Output Il pattern appare con spostamento 0 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

31 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a Variabili: n=9 m=4 p=[0,1,2,0] q=3  4 i=9 b a for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Output Il pattern appare con spostamento 0 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

32 Algoritmo Knuth-Morris-Pratt Esempio di applicazione
Testo = Pattern = b a Variabili: n=9 m=4 p=[0,1,2,0] q=4 i=9 b a for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Output Il pattern appare con spostamento 0 Il pattern appare con spostamento 5 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

33 Algoritmo Knuth-Morris-Pratt Analisi della complessità computazionale
KMP-Matcher(T,P) nlenght[T] mlenght[P] pCOMPUTE-PREFIX-FUNCTION(P) q0 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] La chiamata alla funzione esterna COMPUTE-PREFIX-FUNCTION 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) O(n) Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

34 Algoritmo Knuth-Morris-Pratt Analisi della complessità computazionale
KMP-Matcher(T,P) nlenght[T] mlenght[P] pCOMPUTE-PREFIX-FUNCTION(P) q0 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Il costo ammortizzato delle linee 6-12 è Il tempo effettivo di esecuzione di KMP-Matcher è O(n+m) O(m) O(n) } O(1) Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

35 Algoritmo Knuth-Morris-Pratt Analisi del codice
(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 all’inizio del pattern. KMP-Matcher(T,P) nlenght[T] mlenght[P] p COMPUTE-PREFIX-FUNCTION(P) q0 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

36 Algoritmo Knuth-Morris-Pratt Analisi del codice
(linee 8,9)Se i caratteri selezionati nel pattern P e nel testo T sono uguali, garantiscono l’avanzamento del carattere controllato nel pattern. (linea 12)Necessaria per rilevare correttamente le occorrenze di P in T successive alla prima. KMP-Matcher(T,P) nlenght[T] mlenght[P] p COMPUTE-PREFIX-FUNCTION(P) q0 for i1 to n do while q>0 e P[q+1]≠T[i] do qp[q] if P[q+1]=T[i] then qq+1 if q=m then stampa “…” i-m qp[q] 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 all’inizio del testo. Se si cercano pattern al più di 3-4 caratteri (improbabile per pattern di DNA). 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(n2) In pratica è il più veloce per la maggior parte delle applicazioni Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

39 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
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 1997. M. Régnier Knuth-Morris-Pratt alghorithm: an analysis. INRIA , Jan 1989. Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

40 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
Bibliografia R. Grossi Algoritmi per internet e Web: Ricerca e indicizzazione di testi. Università degli studi di pisa, 2003. 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 Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm

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


Scaricare ppt "The Knuth-Morris-Pratt Algorithm"

Presentazioni simili


Annunci Google