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