The Knuth-Morris-Pratt Algorithm Università Ca Foscari di Venezia Dipartimento di Informatica Corso...
-
Upload
romano-d-agostino -
Category
Documents
-
view
212 -
download
0
Transcript of The Knuth-Morris-Pratt Algorithm Università Ca Foscari di Venezia Dipartimento di Informatica Corso...
The Knuth-Morris-Pratt AlgorithmUniversità Ca’ Foscari di Venezia
Dipartimento di Informatica
Corso di Laboratorio di Linguaggi docente: Cocco NicolettaCocco Nicoletta
Cappellazzo PietroCappellazzo Pietro – 809652 –
Rizzato AndreaRizzato Andrea – 809392 –
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
1 2 3 4 5 6 7 8 9 10 11 12 13
a b c a b a a b c a b a c
a b a as = 3
P
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)
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;
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
A G C A G C T
G A C G A G C A G A G C G A CT
Ps
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 :{1,..,m} →{0,..,m-1} t.c. [i]= max{k:k<q &PK PQ}
P:
PQ:
PK:
[q] è la lunghezza del prefisso più lungo di P che è anche un suffisso di PQ
i 1 2 3 4 5 6 7
P[i] A G C A G C T
[i] 0 0 0 1 2 3 0
A G C A G C
A G C
A G C A G C T
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
8
La funzione prefissopseudocodice
1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. return π
Compute-Prefix-Function(P)
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
9
Esempio di calcolo della funzione prefisso1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. return π
Compute-Prefix-Function(P)
b b b a
Pattern P:
m = 4π[1] = 0k = 0q = 2
Variabili:
1
0
Funzione Prefisso π
i
π[i]
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
10
Esempio di calcolo della funzione prefisso1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. return π
Compute-Prefix-Function(P)b b b a
b b b a
k+1 = 1
q = 2
k = 0+1 = 1 q = 2
Variabili:
?=
1 2
0 1
Funzione Prefisso π
i
π[i]
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
11
Esempio di calcolo della funzione prefisso1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. return π
Compute-Prefix-Function(P)b b b a
b b b a
k+1 = 2
q = 3
k = 1+1 = 2 q = 3
Variabili:
?=
1 2 3
0 1 2
Funzione Prefisso π
i
π[i]
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
12
Esempio di calcolo della funzione prefisso1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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] ← k10. return π
Compute-Prefix-Function(P)b b b a
b b b a
k+1 = 3
q = 4
?=
1 2 3
0 1 2
Funzione Prefisso π
i
π[i]
P[3] ≠P[4] → Entro nel while
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
13
Esempio di calcolo della funzione prefisso1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. return π
Compute-Prefix-Function(P)b b b a
b b b a
k+1 = 2
q = 4
?=
1 2 3
0 1 2
Funzione Prefisso π
i
π[i]
Percorro il pattern all’indietro fino a trovare il primo spostamento valido
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
14
Esempio di calcolo della funzione prefisso1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. return π
Compute-Prefix-Function(P)b b b a
b b b a
k+1 = 1
q = 4
?=
1 2 3 4
0 1 2 0
Funzione Prefisso π
i
π[i]
Sono tornato all’inizio: l’unico spostamento valido è 0
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
15
Analisi del tempo computazionale1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. 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]<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
Analisi del codice1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. return π
Compute-Prefix-Function(P)
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
Analisi del codice1. m ← length[P]2. π[1] ← 03. k ← 04. for q ← 2 to m5. 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+19. π[q] ← k10. 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
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
18
Algoritmo Knuth-Morris-PrattSfruttando 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-PrattPseudocodiceKMP-Matcher(T,P)
1 nlenght[T]
2 mlenght[P]
3 COMPUTE-PREFIX-FUNCTION(P)
4 q0
5 for i1 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 qq+1
10 if q=m
11 then stampa “Il pattern appare con spostamento” i-m
12 q[q]
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
20
Algoritmo Knuth-Morris-PrattEsempio di applicazione
KMP-Matcher(T,P)
1 nlenght[T]
2 mlenght[P]
3 COMPUTE-PREFIX-FUNCTION(P)
4 q0
b b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=0
Testo =
Pattern = b b b a
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
21
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=0 1i=1
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
22
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=1 2i=2
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
23
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=2 3i=3
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
24
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=3 4i=4
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
25
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=4i=4
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
Il pattern appare con spostamento 0
Output
q = [4] = 0
Aggiornamento di q
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
26
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=0 1i=5
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
Il pattern appare con spostamento 0
Output
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
27
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=1 2i=6
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
Il pattern appare con spostamento 0
Output
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
28
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=2 3i=7
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
Il pattern appare con spostamento 0
Output
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
29
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=3 [3] 2i=8
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
Il pattern appare con spostamento 0
Output
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
30
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=2 3i=8
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
Il pattern appare con spostamento 0
Output
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
31
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=3 4i=9
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
Il pattern appare con spostamento 0
Output
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
32
Algoritmo Knuth-Morris-PrattEsempio di applicazioneb b b a b b b b a
Variabili:n=9m=4=[0,1,2,0]q=4i=9
Testo =
Pattern = b b b a
5. for i1 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 qq+1
10. if q=m
11. then stampa “…” i-m
12. q[q]
Il pattern appare con spostamento 0
Output
Il pattern appare con spostamento 5
1 2 3 4 5 6 7 8 9
1 2 3 4
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
33
Algoritmo Knuth-Morris-PrattAnalisi della complessità computazionale
KMP-Matcher(T,P)
1 nlenght[T]
2 mlenght[P]
3 COMPUTE-PREFIX-FUNCTION(P)
4 q0
5 for i1 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 qq+1
10 if q=m
11 then stampa “…” i-m
12 q[q]
O(n)
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)
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
34
Algoritmo Knuth-Morris-PrattAnalisi della complessità computazionale
KMP-Matcher(T,P)
1 nlenght[T]
2 mlenght[P]
3 COMPUTE-PREFIX-FUNCTION(P)
4 q0
5 for i1 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 qq+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)
12
6
)1(*i
OiCi
}
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
35
Algoritmo Knuth-Morris-PrattAnalisi del codice
KMP-Matcher(T,P)
1 nlenght[T]
2 mlenght[P]
3 COMPUTE-PREFIX-FUNCTION(P)
4 q0
5 for i1 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 qq+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 all’inizio del pattern.
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
36
Algoritmo Knuth-Morris-PrattAnalisi del codice
KMP-Matcher(T,P)
1 nlenght[T]
2 mlenght[P]
3 COMPUTE-PREFIX-FUNCTION(P)
4 q0
5 for i1 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 qq+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 l’avanzamento del carattere controllato nel pattern.
(linea 12)Necessaria per rilevare correttamente le occorrenze di P in T successive alla prima.
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
Bibliografia
T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introduzione agli algoritmi, Jackson Libri, seconda edizione. pp. 805-833 cap. 34.
D. E. Knuth, J. H. Morris and V. R. Pratt. Fast Pattern Matching in Strings. SIAM Jrnl. Comput. 6(2) p323-350 Jun 1997.
M. Régnier Knuth-Morris-Pratt alghorithm: an analysis. INRIA , Jan 1989.
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, 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 255-300, Elsevier, Amsterdam. 1990.
Cappellazzo Pietro, Rizzato Andrea - The Knuth Morris Pratt Algorithm
41
Link utili
http://www-igm.univ-mlv.fr/~lecroq/string/index.html
http://www.ics.uci.edu/~eppstein/161/960227.html
http://www.med.yale.edu/bcmm/Informatics/Jan20/KMP.htm