Professional Documents
Culture Documents
Casamento de Padres
Andrew Cavalcante Pacfico andrewcpacifico@gmail.com
Roteiro
Introduo Definio do Problema Algoritmos clssicos
Fora Bruta BMH Shift-Or
Introduo
Casamento de padres possui vrias aplicaes:
Editores de texto Casamento de cadeias de DNA Recuperao de Informao
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
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
Algoritmos Clssicos
Fora Bruta
Consiste em analisar todas as posies do texto entre 0 e n - m para verificar ocorrncia do padro
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;
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
53
54
55
Boyer-Moore-Horspool (BMH)
Idia bsica: otimizar o deslocamento da janela de comparaes
Utiliza heursticas para saltar caracteres dentro do texto
56
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
83
Anlise do BMH
Pior caso acontece quando os deslocamentos so apenas de 1 em 1.
Custo nesse caso: O(nm)
84
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
85
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
86
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
87
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
88
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
89
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
90
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
91
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
92
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
93
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
94
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
95
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
96
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
97
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
98
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
99
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
100
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
101
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
102
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
103
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
104
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
105
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
106
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
107
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
108
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
109
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
110
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
111
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
112
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
113
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
114
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
115
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
116
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
117
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
118
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
119
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
120
O(1)
T(n) = O( ) + (n-m+1)m
T(n) = O(nm)
121
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
122
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
123
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
124
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
125
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
126
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
127
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
128
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
129
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
130
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
131
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
132
O(1)
T(n) = O( ) + ( / )(O(1))
T(n) = O(n/m)
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
134
Shift-And
Ex: T = ABCDEUFAMFGHI P = UFAM
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
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
137
Anlise do Shift-And
Custo total do algoritmo T(n) = O( ) + n * O(1) T(n) = O(n)
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)
139
Shift-And
O que fazer para o algoritmo suportar erros ?
140
Shift-And Aproximado
Autmato com suporte a erros:
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
142
k vezes O(1)
143