Cap. 32

Propaganda
Análise e Síntese de Algoritmos
Emparelhamento de Cadeias de Caracteres
CLRS, Cap. 32
Contexto
•
•
•
•
•
Revisão
Algoritmos em Grafos
Programação Linear
Programação Dinâmica
Algoritmos Greedy
• Emparelhamento de Cadeias de Caracteres
• Problemas NP-Completos
• Algoritmos de Aproximação
2003/2004
Análise e Síntese de Algoritmos
2
Resumo
• Emparelhamento de Cadeias de Caracteres (String
Matching)
– Definição do problema
• Notação
– Algoritmo elementar
– Utilização de autómatos finitos
– Algoritmo de Knuth-Morris-Pratt
– Outros algoritmos
• Rabin-Karp
2003/2004
Análise e Síntese de Algoritmos
3
Formulação do Problema
• Texto:
array com n caracteres, T[1..n]
• Padrão: array com m caracteres, P[1..m]
• Caracteres pertencentes a alfabeto finito 
• Padrão P ocorre com deslocamento s em T se:
– 0  s  n-m
– T[s+1..s+m] = P[1..m]
– Exemplo:
T = aabababab
P = ababab
P ocorre em T com deslocamentos 1 e 3
2003/2004
Análise e Síntese de Algoritmos
4
Notação
• Conjunto de todas as cadeias de caracteres (strings)
de comprimento finito: *
• String vazia: 
–   *
• Comprimento da string x, x
• Concatenação de x e y:
– Representação: xy
– Comprimento: x+y
2003/2004
Análise e Síntese de Algoritmos
5
Notação (Cont.)
• w é prefixo de x, w  x, se x = wy, com y  *
• w é sufixo de x, w  x, se x = yw, com y  *
– Se w  x, então w  x
• Sejam x, y e z strings tais que x  z e y  z. Então,
– Se x  y, então x  y
– Se x  y, então y  x
– Se x = y, então x = y
• Prefixos do padrão pretendido
– P0 = ; Pk = P[1..k]
• Tk = T[1..k]
2003/2004
Análise e Síntese de Algoritmos
6
Algoritmo Elementar
Naive-String-Matcher(T, P)
n = length[T]
m = length[P]
for s = 0 to n - m
if P[1..m] = T[s+1..s+m]
print “Padrão encontrado com deslocação”, s
• Complexidade: ((n-m+1)m)
(m)
• Exemplo
2003/2004
Análise e Síntese de Algoritmos
7
Utilização de Autómatos Finitos
• Autómato finito M (Q, q0, A, , ):
–
–
–
–
–
Q é um conjunto finito de estados
q0 é o estado inicial
A  Q é um conjunto de estados de aceitação
 é o alfabeto de entrada
 é uma função de Q   em Q, designada função de
transição de M
• Autómato no estado q, com caracter de entrada a,
novo estado é dado por (q,a)
• Utilizar DFA para aceitar padrão pretendido
2003/2004
Análise e Síntese de Algoritmos
8
Autómatos Finitos (Cont.)
• Função de estados finais:
– (w): estado de M após ter lido string w
– M aceita w se e só se (w)  A
– Definição:
• () = q0
• (wa) = ((w),a), para w  *, a  
2003/2004
Análise e Síntese de Algoritmos
9
Autómatos Finitos (Cont.)
• Função de sufixo para P[1..m]:
–  : *  { 0, 1, …, m }
– (x) = max { k: Pk  x }
• Comprimento do maior prefixo de P que é sufixo de x
– Saber em que estado DFA deve estar dada a string x
• Dado x, qual o maior prefixo de P que é também sufixo de x?
• Autómato para emparelhamento de strings:
– Q = { 0, 1, …, m }
– Função de transição:
• (q,a) = (Pqa)
(invariante: (Ti) = (Ti))
– Novo estado (q,a) corresponde ao prefixo de P com o maior
comprimento que é também sufixo de Pqa
2003/2004
Análise e Síntese de Algoritmos
10
Autómatos Finitos (Cont.)
Finite-Automaton-Matcher(T, , m)
n = length[T]
q=0
for i = 1 to n
q = (q,T[i])
if q = m
s=i-m
Print “Padrão encontrado com deslocação”, s
• Exemplos
2003/2004
Análise e Síntese de Algoritmos
11
Autómatos Finitos (Cont.)
Compute-Transition-Function(P, )
m = length[P]
for q = 0 to m
foreach a  
k = min(m+1,q+2)
repeat k = k - 1
until Pk  Pqa
(q,a) = k
return 
Identificar maior
k tal que Pk é
um sufixo de Pqa
• Complexidade do cálculo de : O(m3)
• Complexidade do algoritmo: O(n + m3)
– É possível obter O(n + m)
2003/2004
Análise e Síntese de Algoritmos
12
Algoritmo de Knuth-Morris-Pratt
• Complexidade: O(n + m)
• Evita cálculo da função de transição  !
• Função de prefixo para o padrão P:
–  : { 1, 2, …, m }  { 0, 1, …, m-1 }
– [q] = max { k : k < q e Pk  Pq }
• Comprimento do maior prefixo de P que é sufixo de Pq
– Caso o próximo caracter de T não emparelhe, [q] indica
qual o maior prefixo de P que é possível obter como sufixo
de Pq sabendo que em T existe neste momento (i.e. em Ti)
o sufixo Pq (e que P[q+1]  T[i+1])
2003/2004
Análise e Síntese de Algoritmos
13
Algoritmo de Knuth-Morris-Pratt (Cont.)
• Se P[k + 1]  T[i], então Pk+1 não é sufixo de Ti
– Encontrar j tal que Pj seja sufixo de Ti
– Observar que:
• Pk  Ti-1
• P[k]  Pk
– maior sufixo de Pk e Ti-1 que é menor que Pk
• P[[k]]  P[k]
– maior sufixo de P[k], Pk e Ti-1 que é menor que P[k]
• …
Ti-1
Pk
P[k]
P[[k]]
2003/2004
Análise e Síntese de Algoritmos
14
Algoritmo de Knuth-Morris-Pratt (Cont.)
KMP-Matcher(T, P)
n = length[T]
m = length[P]
 = Compute-Prefix-Function(P)
q=0
for i = 1 to n
while q > 0 e P[q + 1]  T[i]
q = [q]
if P[q + 1] = T[i]
q=q+1
if q = m
Print “Padrão encontrado com deslocação”, i-m
q = [q]
2003/2004
Análise e Síntese de Algoritmos
15
Algoritmo de Knuth-Morris-Pratt (Cont.)
• Se P[k + 1]  P[q] então Pk+1 não é sufixo de Pq
– Encontrar j tal que Pj seja sufixo de Pq
– Observar que:
• Pk  Pq-1
• P[k]  Pk
– maior sufixo de Pk e Pq-1 que é menor do que Pk
• P[[k]]  P[k]
– maior sufixo de P[k], Pk e Pq-1 que é menor do que P[k]
• …
Pq-1
Pk
P[k]
P[[k]]
2003/2004
Análise e Síntese de Algoritmos
16
Algoritmo de Knuth-Morris-Pratt (Cont.)
Compute-Prefix-Function(P, )
m = length[P]
[1] = 0
k=0
for q = 2 to m
while k > 0 e P[k + 1]  P[q]
k = [k]
if P[k + 1] = P[q]
k=k+1
[q] = k
return 
• Exemplos
2003/2004
Análise e Síntese de Algoritmos
17
Algoritmo de Knuth-Morris-Pratt (Cont.)
• Complexidade:
– Compute-Prefix-Function: O(m)
• k é incrementado de 1 unidade não mais do que uma vez por
cada valor de q, com número total de incrementos limitado
superiormente por m
• Valor de k decrementado devido a atribuição k = [k], mas k > 0
e valor acumulado de decremento limitado a um total de m unidades
– KMP-Matcher: O(n + m)
• Análise semelhante à anterior permite obter resultado
2003/2004
Análise e Síntese de Algoritmos
18
Revisão
• Emparelhamento de cadeiras caracteres
–
–
–
–
Algoritmo elementar
Utilização de autómatos finitos
Algoritmo de Knuth-Morris-Pratt
Outros algoritmos
• Rabin-Karp
• Boyer Moore
• ...
• A seguir:
– Problemas NP-Completos
– Algoritmos de aproximação
2003/2004
Análise e Síntese de Algoritmos
(CLRS, Cap. 34)
(CLRS, Cap. 35)
19
Download