190 likes | 327 Views
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
E N D
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 Análise e Síntese de Algoritmos
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 Análise e Síntese de Algoritmos
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 Análise e Síntese de Algoritmos
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 Análise e Síntese de Algoritmos
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] Análise e Síntese de Algoritmos
(m) 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 Análise e Síntese de Algoritmos
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 Análise e Síntese de Algoritmos
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 Análise e Síntese de Algoritmos
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 Análise e Síntese de Algoritmos
Autómatos Finitos (Cont.) • Exemplos 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 Análise e Síntese de Algoritmos
Identificar maior k tal que Pk é um sufixo de Pqa 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 - 1 untilPk Pqa (q,a) = k return Análise e Síntese de Algoritmos
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]) Análise e Síntese de Algoritmos
Ti-1 Pk P[k] P[[k]] Algoritmo de Knuth-Morris-Pratt (Cont.) • Se P[k + 1] T[i], então Pk+1nã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] • … Análise e Síntese de Algoritmos
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] Análise e Síntese de Algoritmos
Pq-1 Pk P[k] P[[k]] Algoritmo de Knuth-Morris-Pratt (Cont.) • Se P[k + 1] P[q] então Pk+1nã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] • … Análise e Síntese de Algoritmos
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 Análise e Síntese de Algoritmos
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 Análise e Síntese de Algoritmos
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) Análise e Síntese de Algoritmos