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 2006/2007 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 2006/2007 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 2006/2007 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 2006/2007 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 P 0 = ε; P k = P[1..k] T k = T[1..k] 2006/2007 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 2006/2007 Análise e Síntese de Algoritmos 7
Utilização de Autómatos Finitos Autómato finito M (Q, q 0, A, Σ, δ): Q é um conjunto finito de estados q 0 é 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 2006/2007 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: φ(ε) = q 0 φ(wa) = δ(φ(w),a), para w Σ*, a Σ 2006/2007 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: P k > 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) = σ(p q a) (invariante: φ(t i ) = σ(t i )) Novo estado δ(q,a) corresponde ao prefixo de P com o maior comprimento que é também sufixo de P q a 2006/2007 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 2006/2007 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 P k > P q a δ(q,a) = k return δ Identificar maior k tal que P k é um sufixo de P q a Complexidade do cálculo de δ: O(m 3 Σ ) Complexidade do algoritmo: O(n + m 3 Σ ) É possível obter O(n + m Σ ) 2006/2007 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 P k > P q } Comprimento do maior prefixo de P que é sufixo de P q 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 P q sabendo que em T existe neste momento (i.e. em T i ) o sufixo P q (e que P[q+1] T[i+1]) 2006/2007 Análise e Síntese de Algoritmos 13
Algoritmo de Knuth-Morris-Pratt (Cont.) Se P[k + 1] T[i], então P k+1 não é sufixo de T i Encontrar j tal que P j seja sufixo de T i Observar que: P k > T i-1 P π[k] > P k maior sufixo de P k e T i-1 que é menor que P k P π[π[k]] > P π[k] maior sufixo de P π[k], P k e T i-1 que é menor que P π[k] T i-1 P k P π[k] P π[π[k]] 2006/2007 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] 2006/2007 Análise e Síntese de Algoritmos 15
Algoritmo de Knuth-Morris-Pratt (Cont.) Exemplos 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 π 2006/2007 Análise e Síntese de Algoritmos 16
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 2006/2007 Análise e Síntese de Algoritmos 17
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) 2006/2007 Análise e Síntese de Algoritmos 18