You are on page 1of 143

Projeto e Anlise de Algoritmos

Casamento de Padres
Andrew Cavalcante Pacfico andrewcpacifico@gmail.com

Instituto de Computao (IComp) Universidade Federal do Amazonas (UFAM)

Projeto e Anlise de Algoritmos

Roteiro
Introduo Definio do Problema Algoritmos clssicos
Fora Bruta BMH Shift-Or

Projeto e Anlise de Algoritmos

Introduo
Casamento de padres possui vrias aplicaes:
Editores de texto Casamento de cadeias de DNA Recuperao de Informao

Vrios algoritmos propostos

Projeto e Anlise de Algoritmos

Definio 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 Anlise de Algoritmos

Casamento de Padres Exato


Texto T[1 .. n] e Padro 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
c a d t f l a o p m e n u w g o s=6 a o p m e P

Projeto e Anlise de Algoritmos

Casamento de Padres Aproximado


Permite insero, remoo ou substituio de caracteres no texto Nmero de erros conhecido como distncia de edio ou distncia de Levenshtein Objetivo pode ser capturar erros de escrita, ocr ou simplesmente ajudar um usurio que no sabe como escrever uma dada palavra

Projeto e Anlise de Algoritmos

Casamento de Padres Aproximado


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

Remoo
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

Substituio

Projeto e Anlise de Algoritmos

Algoritmos Clssicos

Projeto e Anlise de Algoritmos

Fora Bruta
Consiste em analisar todas as posies do texto entre 0 e n - m para verificar ocorrncia do padro

O padro desloca-se no texto como uma janela

Projeto e Anlise de Algoritmos

10

Fora 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 Anlise de Algoritmos

11

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

a m u f a m c T

m P

Projeto e Anlise de Algoritmos

12

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

a m u f a m c T

m P

Projeto e Anlise de Algoritmos

13

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

a m u f a m c T

m P

Projeto e Anlise de Algoritmos

14

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

a m u f a m c T

m P

Projeto e Anlise de Algoritmos

15

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

a m u f a m c T

m P

Projeto e Anlise de Algoritmos

16

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

a m u f a m c T

m P

Projeto e Anlise de Algoritmos

17

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

m j
4

a m u f a m c T

m P

Projeto e Anlise de Algoritmos

18

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

m j
4

a m u f a m c T

m P

Projeto e Anlise de Algoritmos

19

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 1 2 3 12: end for u f a 13: return R;

R
4 5 6 7 8 9 10 11 12

a m u f a m c T j

m P

Projeto e Anlise de Algoritmos

20

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 1 2 3 12: end for u f a 13: return R;

1
4 5 6 7 8 9 10 11 12

a m u f a m c T j

m P

Projeto e Anlise de Algoritmos

21

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 12: end for u f 13: return R;

1
4 5 6 7 8 9 10 11 12

a m u f a m c T

a m P

Projeto e Anlise de Algoritmos

22

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 12: end for u f 13: return R;

1
4 5 6 7 8 9 10 11 12

a m u f a m c T

a m P

Projeto e Anlise de Algoritmos

23

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 2 12: end for u f 13: return R;

1
4 5 6 7 8 9 10 11 12

a m u f a m c T

a m P

Projeto e Anlise de Algoritmos

24

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 12: end for u 13: return R;

1
4 5 6 7 8 9 10 11 12

a m u f a m c T

f a m P

Projeto e Anlise de Algoritmos

25

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 12: end for u 13: return R;

1
4 5 6 7 8 9 10 11 12

a m u f a m c T

f a m P

Projeto e Anlise de Algoritmos

26

Fora 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; i 6: end if 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); j 11: end if 1 12: end for u 13: return R;

1
4 5 6 7 8 9 10 11 12

a m u f a m c T

f a m P

Projeto e Anlise de Algoritmos

27

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T

j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

28

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T

j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

29

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T

j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

30

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

31

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

32

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

33

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

34

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

35

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1
i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

36

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

37

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

38

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

39

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

40

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

41

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

42

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

43

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

44

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

45

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

46

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

47

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

48

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 8 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

49

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 8 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

50

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 8 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

51

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 8 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

52

Fora 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 1 2 3 7: j j + 1 8: end for u f a 9: if j = m+1 then 10: ENQUEUE(R,i); 11: end if 12: end for 13: return R;

1 8 i
4 5 6 7 8 9 10 11 12

a m u f a m c T
j
1 2 3 4

u f a m P

Projeto e Anlise de Algoritmos

53

Anlise do Fora 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;

n-m+1 vezes m vezes

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

Projeto e Anlise de Algoritmos

54

Qual o problema do Fora Bruta ?

Projeto e Anlise de Algoritmos

55

Boyer-Moore-Horspool (BMH)
Idia bsica: otimizar o deslocamento da janela de comparaes
Utiliza heursticas para saltar caracteres dentro do texto

Projeto e Anlise de Algoritmos

56

BMH Clculo dos saltos


Utiliza-se uma tabela de saltos do tamanho do alfabeto Cada posio da tabela de saltos contm a distncia da ltima ocorrncia do caractere para o fim do padro (sem contar a ltima posio)
Exemplo
P = teste d[t] = 1; d[s] = 2; d[e] = 3; (demais posies da tabela ficam com um salto do tamanho do padro)

Projeto e Anlise 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 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 Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

58

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 4 4 4 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then 11: break; 1 2 3 4 12: end if 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

59

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then 11: break; 1 2 3 4 12: end if 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

60

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 1 2 3 4 12: end if 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

61

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 1 2 3 4 12: end if 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

62

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 1 2 3 4 12: end if 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

63

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 1 2 3 4 12: end if 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

64

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 1 2 3 4 12: end if 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

65

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

66

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

67

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

68

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

69

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

70

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

71

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

72

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

73

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

74

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

75

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

76

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then j 11: break; 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

77

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then 11: break; j 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

78

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then 11: break; j 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

79

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then 11: break; j 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

80

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; i 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then 11: break; j 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Projeto e Anlise de Algoritmos

81

BMH
BMH(T,n,P,m) = {a, b, c, d} 1: for i 1 to do a b c d 2: skipTable[i] m; 1 3 2 4 skipTable 3: end for 4: for i 1 to m-1 do 5: skipTable[P[i]] m-i; 6: end for 1 2 3 4 5 6 7 8 9 10 11 7: i m 8: while i n do d b a b c a a d b a d 9: for j m downto 1 do 10: if T[i-m+j] != P[j] then 11: break; j 12: end if 1 2 3 4 13: end for b c a a P 14: if j = 0 then 15: print Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

i
T

Projeto e Anlise de Algoritmos

82

Anlise 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 Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

Qual o melhor caso do algoritmo ? E o pior ?

Projeto e Anlise de Algoritmos

83

Anlise do BMH
Pior caso acontece quando os deslocamentos so apenas de 1 em 1.
Custo nesse caso: O(nm)

Melhor caso acontece quando os deslocamentos so do tamanho do padro


Custo nesse caso: O(n/m)

Projeto e Anlise de Algoritmos

84

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

85

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

86

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

87

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

88

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

89

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

90

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

91

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

92

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

93

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

94

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

95

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

96

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

97

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

98

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

99

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

100

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

101

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

102

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

103

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

104

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4

i
5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

105

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

106

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

107

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

108

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

109

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

110

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

111

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

112

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

113

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

114

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

115

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5

i
6 7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

116

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6

i
7 8 9 10 11

1 3 4 4 skipTable

a a a a a a a a a a a T j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

117

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6

i
7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

118

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6

i
7 8 9 10 11

1 3 4 4 skipTable

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

Comportamento se repete at o final do texto

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

119

Anlise do BMH Pior caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6

i
7 8 9 10 11

1 3 4 4 skipTable

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

Comportamento se repete at o final do texto (n-m+1)m operaes sero realizadas

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

120

Anlise do BMH Pior caso


Pr-Processamento
O( ) Emparelhamento n - m + 1 vezes m vezes
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 Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

O(1)

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

Projeto e Anlise de Algoritmos

121

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

122

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

123

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

124

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3

i
4 5 6 7 8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

125

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6 7

i
8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

126

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6 7

i
8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

127

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6 7

i
8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

128

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6 7

i
8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

129

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6 7

i
8 9 10 11

1 3 4 4 skipTable

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

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

130

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6 7 8 9 10 11

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

1 3 4 4 skipTable

j
1 2 3 4

b a a a P

Projeto e Anlise de Algoritmos

131

Anlise do BMH Melhor caso


Ocorre quando a disposio dos caracteres do texto e do padro geram a seguinte situao:
= {a, b, c, d}
a b c d 1 2 3 4 5 6 7 8 9 10 11

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

1 3 4 4 skipTable

/ operaes so realizadas

b a a a P

Projeto e Anlise de Algoritmos

132

Anlise do BMH Melhor caso


Pr-Processamento
O( ) Emparelhamento / vezes 1 vez
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 Padro encontrado em: i 16: end if 17: i i + skipTable[T[i]]; 18: end while

O(1)

T(n) = O( ) + ( / )(O(1))
T(n) = O(n/m)

Projeto e Anlise de Algoritmos

133

Shift-And
A idia do algoritmo guardar todos os prefixos de P que casem com um sufixo do texto lido
Utiliza mscara de bits para agilizar as operaes Pode ser visto como a simulao de um autmato que pesquisa o padro no texto

Projeto e Anlise de Algoritmos

134

Shift-And
Ex: T = ABCDEUFAMFGHI P = UFAM

Projeto e Anlise de Algoritmos

135

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 Padro encontrado em: i-m+1; 12: end if 13: end for

Projeto e Anlise de Algoritmos

136

Anlise do Shift-And
Pr-Processamento
O( )
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 Padro encontrado em: i-m+1; 12: end if 13: end for

Emparelhamento n vezes O(1)

Projeto e Anlise de Algoritmos

137

Anlise do Shift-And
Custo total do algoritmo T(n) = O( ) + n * O(1) T(n) = O(n)

Projeto e Anlise de Algoritmos

138

Anlise do Shift-And
Custo total do algoritmo T(n) = O( ) + n * O(1) T(n) = O(n)
Desde que as operaes de manipulao dos bits sejam O(1)

Projeto e Anlise de Algoritmos

139

Shift-And
O que fazer para o algoritmo suportar erros ?

Projeto e Anlise de Algoritmos

140

Shift-And Aproximado
Autmato com suporte a erros:

Projeto e Anlise de Algoritmos

141

Shift-And Aproximado
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

Projeto e Anlise de Algoritmos

142

Anlise do Shift-And Aproximado


k vezes n vezes
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)

Projeto e Anlise de Algoritmos

143

Anlise do Shift-And Aproximado


Custo total do algoritmo T(n) = O( ) + k + nk T(n) = O(nk)

You might also like