casamento de padrões

143
Casamento de Padrões Andrew Cavalcante Pacífico [email protected] Instituto de Computação (IComp) Universidade Federal do Amazonas (UFAM) Projeto e Análise de Algoritmos

Upload: andrewcpacifico

Post on 18-Apr-2015

108 views

Category:

Documents


7 download

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

TRANSCRIPT

Page 1: Casamento de Padrões

Casamento de Padrões

Andrew Cavalcante Pacífico

[email protected]

Instituto de Computação (IComp)

Universidade Federal do Amazonas (UFAM)

Projeto e Análise de Algoritmos

Page 2: Casamento de Padrões

Roteiro

• Introdução

• Definição do Problema

• Algoritmos clássicos

▫ Força Bruta

▫ BMH

▫ Shift-Or

Projeto e Análise de Algoritmos 2

Page 3: Casamento de Padrões

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

Page 4: Casamento de Padrões

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

Page 5: Casamento de Padrões

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

Page 6: Casamento de Padrões

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

Page 7: Casamento de Padrões

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

Page 8: Casamento de Padrões

Algoritmos Clássicos

Projeto e Análise de Algoritmos 8

Page 9: Casamento de Padrões

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

Page 10: Casamento de Padrões

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

Page 11: Casamento de Padrões

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

Page 12: Casamento de Padrões

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

Page 13: Casamento de Padrões

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

Page 14: Casamento de Padrões

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

Page 15: Casamento de Padrões

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

Page 16: Casamento de Padrões

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

Page 17: Casamento de Padrões

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

Page 18: Casamento de Padrões

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

Page 19: Casamento de Padrões

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

Page 20: Casamento de Padrões

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

Page 21: Casamento de Padrões

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

Page 22: Casamento de Padrões

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

Page 23: Casamento de Padrões

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

Page 24: Casamento de Padrões

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

Page 25: Casamento de Padrões

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

Page 26: Casamento de Padrões

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

Page 27: Casamento de Padrões

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

Page 28: Casamento de Padrões

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

Page 29: Casamento de Padrões

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

Page 30: Casamento de Padrões

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

Page 31: Casamento de Padrões

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

Page 32: Casamento de Padrões

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

Page 33: Casamento de Padrões

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

Page 34: Casamento de Padrões

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

Page 35: Casamento de Padrões

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

Page 36: Casamento de Padrões

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

Page 37: Casamento de Padrões

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

Page 38: Casamento de Padrões

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

Page 39: Casamento de Padrões

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

Page 40: Casamento de Padrões

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

Page 41: Casamento de Padrões

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

Page 42: Casamento de Padrões

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

Page 43: Casamento de Padrões

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

Page 44: Casamento de Padrões

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

Page 45: Casamento de Padrões

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

Page 46: Casamento de Padrões

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

Page 47: Casamento de Padrões

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

Page 48: Casamento de Padrões

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

Page 49: Casamento de Padrões

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

Page 50: Casamento de Padrões

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

Page 51: Casamento de Padrões

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

Page 52: Casamento de Padrões

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

Page 53: Casamento de Padrões

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

Page 54: Casamento de Padrões

Qual o problema do Força Bruta ?

Projeto e Análise de Algoritmos 54

Page 55: Casamento de Padrões

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

Page 56: Casamento de Padrões

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

Page 57: Casamento de Padrões

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

Page 58: Casamento de Padrões

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

Page 59: Casamento de Padrões

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

Page 60: Casamento de Padrões

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

Page 61: Casamento de Padrões

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

Page 62: Casamento de Padrões

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

Page 63: Casamento de Padrões

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

Page 64: Casamento de Padrões

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

Page 65: Casamento de Padrões

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

Page 66: Casamento de Padrões

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

Page 67: Casamento de Padrões

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

Page 68: Casamento de Padrões

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

Page 69: Casamento de Padrões

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

Page 70: Casamento de Padrões

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

Page 71: Casamento de Padrões

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

Page 72: Casamento de Padrões

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

Page 73: Casamento de Padrões

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

Page 74: Casamento de Padrões

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

Page 75: Casamento de Padrões

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

Page 76: Casamento de Padrões

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

Page 77: Casamento de Padrões

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

Page 78: Casamento de Padrões

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

Page 79: Casamento de Padrões

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

Page 80: Casamento de Padrões

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

Page 81: Casamento de Padrões

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

Page 82: Casamento de Padrões

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 ?

Page 83: Casamento de Padrões

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

Page 84: Casamento de Padrões

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

Page 85: Casamento de Padrões

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

Page 86: Casamento de Padrões

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

Page 87: Casamento de Padrões

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

Page 88: Casamento de Padrões

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

Page 89: Casamento de Padrões

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

Page 90: Casamento de Padrões

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

Page 91: Casamento de Padrões

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

Page 92: Casamento de Padrões

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

Page 93: Casamento de Padrões

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

Page 94: Casamento de Padrões

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

Page 95: Casamento de Padrões

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

Page 96: Casamento de Padrões

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

Page 97: Casamento de Padrões

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

Page 98: Casamento de Padrões

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

Page 99: Casamento de Padrões

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

Page 100: Casamento de Padrões

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

Page 101: Casamento de Padrões

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

Page 102: Casamento de Padrões

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

Page 103: Casamento de Padrões

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

Page 104: Casamento de Padrões

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

Page 105: Casamento de Padrões

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

Page 106: Casamento de Padrões

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

Page 107: Casamento de Padrões

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

Page 108: Casamento de Padrões

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

Page 109: Casamento de Padrões

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

Page 110: Casamento de Padrões

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

Page 111: Casamento de Padrões

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

Page 112: Casamento de Padrões

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

Page 113: Casamento de Padrões

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

Page 114: Casamento de Padrões

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

Page 115: Casamento de Padrões

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

Page 116: Casamento de Padrões

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

Page 117: Casamento de Padrões

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

Page 118: Casamento de Padrões

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

Page 119: Casamento de Padrões

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

Page 120: Casamento de Padrões

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)

Page 121: Casamento de Padrões

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

Page 122: Casamento de Padrões

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

Page 123: Casamento de Padrões

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

Page 124: Casamento de Padrões

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

Page 125: Casamento de Padrões

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

Page 126: Casamento de Padrões

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

Page 127: Casamento de Padrões

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

Page 128: Casamento de Padrões

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

Page 129: Casamento de Padrões

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

Page 130: Casamento de Padrões

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

Page 131: Casamento de Padrões

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

Page 132: Casamento de Padrões

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)

Page 133: Casamento de Padrões

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

Page 134: Casamento de Padrões

Shift-And

Ex:

T = “ABCDEUFAMFGHI”

P = “UFAM”

Projeto e Análise de Algoritmos 134

Page 135: Casamento de Padrões

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

Page 136: Casamento de Padrões

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)

Page 137: Casamento de Padrões

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

Page 138: Casamento de Padrões

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)

Page 139: Casamento de Padrões

Shift-And

Projeto e Análise de Algoritmos 139

O que fazer para o algoritmo suportar erros ?

Page 140: Casamento de Padrões

Shift-And Aproximado

• Autômato com suporte a erros:

Projeto e Análise de Algoritmos 140

Page 141: Casamento de Padrões

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

Page 142: Casamento de Padrões

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

Page 143: Casamento de Padrões

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