Upload
andrewcpacifico
View
109
Download
7
Embed Size (px)
DESCRIPTION
Projeto e Análise de AlgoritmosCasamento de PadrõesAndrew Cavalcante Pacífico [email protected] 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
Citation preview
Casamento de Padrões
Andrew Cavalcante Pacífico
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