Casamento de Padrões

Post on 18-Apr-2015

106 views 7 download

description

Projeto e Análise de AlgoritmosCasamento de PadrõesAndrew Cavalcante Pacífico andrewcpacifico@gmail.comInstituto de Computação (IComp) Universidade Federal do Amazonas (UFAM)Projeto e Análise de Algoritmos2Roteiro• Introdução • Definição do Problema • Algoritmos clássicos▫ Força Bruta ▫ BMH ▫ Shift-OrProjeto e Análise de Algoritmos3Introdução• Casamento de padrões possui várias aplicações:▫ Editores de texto ▫ Casamento de cadeias de DNA ▫ Recuperação de Informação• Vári

Transcript of Casamento de Padrões

Casamento de Padrões

Andrew Cavalcante Pacífico

andrewcpacifico@gmail.com

Instituto de Computação (IComp)

Universidade Federal do Amazonas (UFAM)

Projeto e Análise de Algoritmos

Roteiro

• Introdução

• Definição do Problema

• Algoritmos clássicos

▫ Força Bruta

▫ BMH

▫ Shift-Or

Projeto e Análise de Algoritmos 2

Introdução

• Casamento de padrões possui várias

aplicações:

▫ Editores de texto

▫ Casamento de cadeias de DNA

▫ Recuperação de Informação

• Vários algoritmos propostos

Projeto e Análise de Algoritmos 3

Definição do Problema

• Dadas duas cadeias T e P, verificar se P está

contida em T

• Pode ser exato ou aproximado (com erros)

• Pode ser resolvido em tempo linear em todos os

casos

Projeto e Análise de Algoritmos 4

Casamento de Padrões Exato

• Texto T[1 .. n] e Padrão P[1 .. m]

• Tamanhos n e m, onde m ≤ n

• Encontrar todos os deslocamentos s onde

T[s+1 .. s+m] = P[1 .. m], com 0 ≤ s ≤ n – m

Projeto e Análise de Algoritmos 5

c a d t f l a o p m e n u w g o

a o p m e

T

P s = 6

Casamento de Padrões Aproximado

• Permite inserção, remoção ou substituição de

caracteres no texto

• Número de erros é conhecido como distância de

edição ou distância de Levenshtein

• Objetivo pode ser capturar erros de escrita, ocr

ou simplesmente ajudar um usuário que não

sabe como escrever uma dada palavra

Projeto e Análise de Algoritmos 6

Casamento de Padrões Aproximado

• Inserção

• Remoção

• Substituição

Projeto e Análise de Algoritmos 7

c b a r u a q l o p v c

u a l o

c b a r u a w s o p v c

u a l w

c b a r u a q l o p v c

u a w l

Algoritmos Clássicos

Projeto e Análise de Algoritmos 8

Força Bruta

• Consiste em analisar todas as posições do texto

entre 0 e n - m para verificar ocorrência do

padrão

• O padrão desloca-se no texto como uma janela

Projeto e Análise de Algoritmos 9

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 10

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 11

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 12

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 13

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 14

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 15

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 16

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 17

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 18

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 19

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 20

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 21

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 22

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 23

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 24

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 25

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 26

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 27

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 28

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 29

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 30

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 31

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 32

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 33

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 34

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 35

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 36

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 37

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 38

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 39

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 40

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 41

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 42

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 43

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 44

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 45

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 46

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 47

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 48

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 8 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 49

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 8 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 50

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 8 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 51

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 8 R

Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 52

u f a m a m u f a m c T

u f a m P

i

1 2 3 4 5 6 7 8 9 10 11 12

j

1 2 3 4

1 8 R

Análise do Força Bruta

BRUTE-FORCE(T,n,P,m)

1: R Ø

2: for i 1 to n-m+1 do

3: for j 1 to m do

4: if P[j] != T[i+j-1] then

5: break;

6: end if

7: j j + 1

8: end for

9: if j = m+1 then

10: ENQUEUE(R,i);

11: end if

12: end for

13: return R;

Projeto e Análise de Algoritmos 53

n-m+1 vezes

m vezes

O(1)

T(n) = (n-m+1)m

Qual o problema do Força Bruta ?

Projeto e Análise de Algoritmos 54

Boyer-Moore-Horspool (BMH)

• Idéia básica: otimizar o deslocamento da janela

de comparações

▫ Utiliza heurísticas para saltar caracteres dentro do

texto

Projeto e Análise de Algoritmos 55

BMH – Cálculo dos saltos

• Utiliza-se uma tabela de saltos do tamanho do

alfabeto

• Cada posição da tabela de saltos contém a

distância da última ocorrência do caractere para

o fim do padrão (sem contar a última posição)

▫ Exemplo P = teste

d[t] = 1; d[s] = 2; d[e] = 3; (demais posições da tabela ficam

com um salto do tamanho do padrão)

Projeto e Análise de Algoritmos 56

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j 1 downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 57

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 58

Σ = {a, b, c, d}

4 4 4 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 59

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 60

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 61

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 62

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 63

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 64

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 65

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 66

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 67

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 68

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 69

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 70

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 71

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 72

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 73

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 74

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 75

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 76

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 77

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 78

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 79

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 80

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 81

Σ = {a, b, c, d}

1 3 2 4

a b c d

skipTable

a b c a a d b a d b d T

1 2 3 4 5 6 7 8 9 10 11

b c a a P

1 2 3 4

j

i

Análise do BMH

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 82

Qual é o melhor caso do

algoritmo ? E o pior ?

Análise do BMH

• Pior caso acontece quando os deslocamentos

são apenas de 1 em 1.

▫ Custo nesse caso: O(nm)

• Melhor caso acontece quando os

deslocamentos são do tamanho do padrão

▫ Custo nesse caso: O(n/m)

Projeto e Análise de Algoritmos 83

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 84

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 85

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 86

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 87

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 88

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 89

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 90

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 91

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 92

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 93

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 94

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 95

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 96

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 97

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 98

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 99

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 100

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 101

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 102

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 103

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 104

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 105

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 106

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 107

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 108

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 109

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 110

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 111

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 112

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 113

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 114

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 115

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 116

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 117

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 118

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Comportamento se

repete até o final do

texto

Análise do BMH – Pior caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 119

a a a a a a a a a a a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Comportamento se

repete até o final do

texto

(n-m+1)m operações

serão realizadas

Análise do BMH – Pior caso

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 120

Pré-Processamento

O( 𝛴 )

Emparelhamento

n - m + 1 vezes m vezes

O(1)

T(n) = O( 𝛴 ) + (n-m+1)m

T(n) = O(nm)

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 121

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 122

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 123

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 124

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 125

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 126

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 127

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 128

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 129

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 130

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

Análise do BMH – Melhor caso

• Ocorre quando a disposição dos caracteres do

texto e do padrão geram a seguinte situação:

Projeto e Análise de Algoritmos 131

c d a b c d a b c b a T

1 2 3 4 5 6 7 8 9 10 11

b a a a P

1 2 3 4

Σ = {a, b, c, d}

1 3 4 4

a b c d

skipTable

j

i

𝑛/𝑚 operações

são realizadas

Análise do BMH – Melhor caso

BMH(T,n,P,m)

1: for i 1 to Σ do

2: skipTable[i] m;

3: end for

4: for i 1 to m-1 do

5: skipTable[P[i]] m-i;

6: end for

7: i m

8: while i ≤ n do

9: for j m downto 1 do

10: if T[i-m+j] != P[j] then

11: break;

12: end if

13: end for

14: if j = 0 then

15: print “Padrão encontrado em: “i

16: end if

17: i i + skipTable[T[i]];

18: end while

Projeto e Análise de Algoritmos 132

Pré-Processamento

O( 𝛴 )

Emparelhamento

𝑛/𝑚 vezes 1 vez

O(1)

T(n) = O( 𝛴 ) + ( 𝑛/𝑚 )(O(1))

T(n) = O(n/m)

Shift-And

• A idéia do algoritmo é guardar todos os prefixos

de P que casem com um sufixo do texto lido

▫ Utiliza máscara de bits para agilizar as operações

▫ Pode ser visto como a simulação de um autômato

que pesquisa o padrão no texto

Projeto e Análise de Algoritmos 133

Shift-And

Ex:

T = “ABCDEUFAMFGHI”

P = “UFAM”

Projeto e Análise de Algoritmos 134

Shift-And

SHIFT-AND(T,n,P,m)

1: for i 1 to Σ do

2: Masc[i] 0m;

3: end for

4: for i 1 to m do

5: Masc[P[i]] M[P[i]] | 0j-110m-j;

6: end for

7: R 0m;

8: for i 1 to n do

9: R ((R >> 1) | 10m-1) & Masc[T[i]];

10: if R & 0m-11 != 0m then

11: print “Padrão encontrado em: “i-m+1;

12: end if

13: end for

Projeto e Análise de Algoritmos 135

Análise do Shift-And

SHIFT-AND(T,n,P,m)

1: for i 1 to Σ do

2: Masc[i] 0m;

3: end for

4: for i 1 to m do

5: Masc[P[i]] M[P[i]] | 0j-110m-j;

6: end for

7: R 0m;

8: for i 1 to n do

9: R ((R >> 1) | 10m-1) & Masc[T[i]];

10: if R & 0m-11 != 0m then

11: print “Padrão encontrado em: “i-m+1;

12: end if

13: end for

Projeto e Análise de Algoritmos 136

Pré-Processamento

O( 𝛴 )

Emparelhamento

n vezes

O(1)

Análise do Shift-And

• Custo total do algoritmo

T(n) = O( 𝛴 ) + n * O(1)

T(n) = O(n)

Projeto e Análise de Algoritmos 137

Análise do Shift-And

• Custo total do algoritmo

T(n) = O( 𝛴 ) + n * O(1)

T(n) = O(n)

Projeto e Análise de Algoritmos 138

Desde que as

operações de

manipulação dos bits

sejam O(1)

Shift-And

Projeto e Análise de Algoritmos 139

O que fazer para o algoritmo suportar erros ?

Shift-And Aproximado

• Autômato com suporte a erros:

Projeto e Análise de Algoritmos 140

Shift-And Aproximado

Projeto e Análise de Algoritmos 141

SHIFT-AND-APROXIMADO(T,n,P,m,k)

1: Pré-Processamento (igual ao Shift-And Exato)

2: for j 0 to k do R[j] 1j0m-1; end for

3: for i 1 to n do

4: Rant R[0];

5: Rnovo ((Rant >> 1) | 10m-1) & Masc[T[i]];

6: R[0] Rnovo;

7: for j 1 to k do

9: Rnovo (R >> 1 & Masc[T[i]]) | Rant |

((Rant | Rnovo) >> 1);

10: Rant R[j];

11: R[j] Rnovo|10m-1;

12: end for

13: if Rnovo & 0m-11 != 0m; end if

13: end for

Análise do Shift-And Aproximado

Projeto e Análise de Algoritmos 142

SHIFT-AND-APROXIMADO(T,n,P,m,k)

1: Pré-Processamento (igual ao Shift-And Exato)

2: for j 0 to k do R[j] 1j0m-1; end for

3: for i 1 to n do

4: Rant R[0];

5: Rnovo ((Rant >> 1) | 10m-1) & Masc[T[i]];

6: R[0] Rnovo;

7: for j 1 to k do

9: Rnovo (R >> 1 & Masc[T[i]]) | Rant |

((Rant | Rnovo) >> 1);

10: Rant R[j];

11: R[j] Rnovo|10m-1;

12: end for

13: if Rnovo & 0m-11 != 0m; end if

13: end for

k vezes

O(1)

n vezes

k vezes

Análise do Shift-And Aproximado

• Custo total do algoritmo

T(n) = O( 𝛴 ) + k + nk

T(n) = O(nk)

Projeto e Análise de Algoritmos 143