The Knuth-Morris-Pratt Algorithm Università Ca Foscari di Venezia Dipartimento di Informatica Corso...

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

Transcript of The Knuth-Morris-Pratt Algorithm Università Ca Foscari di Venezia Dipartimento di Informatica Corso...

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

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 –

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

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

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

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)

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

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;

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

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

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

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

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

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

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

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)

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

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]

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

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]

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

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]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

}

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

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.

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

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.

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

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

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

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

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

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.

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

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.

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

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