Análise e Síntese de Algoritmos
Click here to load reader
description
Transcript of Análise e Síntese de Algoritmos
Análise e Síntese de Algoritmos
Emparelhamento de Cadeias de Caracteres CLRS, Cap. 32
2003/2004 Análise e Síntese de Algoritmos 2
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 3
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 4
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 5
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 6
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 7
Algoritmo Elementar
• Complexidade: ((n-m+1)m)
• Exemplo
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
(m)
2003/2004 Análise e Síntese de Algoritmos 8
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 9
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 10
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 11
Autómatos Finitos (Cont.)
• Exemplos
Finite-Automaton-Matcher(T, , m)n = length[T]q = 0for i = 1 to n
q = (q,T[i])if q = m
s = i - mPrint “Padrão encontrado com deslocação”, s
2003/2004 Análise e Síntese de Algoritmos 12
Autómatos Finitos (Cont.)
• Complexidade do cálculo de : O(m3)• Complexidade do algoritmo: O(n + m3)
– É possível obter O(n + m)
Compute-Transition-Function(P, )m = length[P]for q = 0 to m
foreach a k = min(m+1,q+2)repeat k = k - 1until Pk Pqa (q,a) = k
return
Identificar maiork tal que Pk éum sufixo de Pqa
2003/2004 Análise e Síntese de Algoritmos 13
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 14
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 15
Algoritmo de Knuth-Morris-Pratt (Cont.)
KMP-Matcher(T, P)n = length[T]m = length[P] = Compute-Prefix-Function(P)q = 0for 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 = mPrint “Padrão encontrado com deslocação”, i-mq = [q]
2003/2004 Análise e Síntese de Algoritmos 16
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 17
Algoritmo de Knuth-Morris-Pratt (Cont.)
• Exemplos
Compute-Prefix-Function(P, )m = length[P][1] = 0k = 0for 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] = kreturn
2003/2004 Análise e Síntese de Algoritmos 18
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 19
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 (CLRS, Cap. 34)– Algoritmos de aproximação (CLRS, Cap. 35)