370 likes | 553 Views
Casamento de Padrões Um Estudo Empírico. Leonardo Teixeira Passos Thiago Henrique Braga. Sumário. Introdução Definição do Problema Algoritmos clássicos Resultados Experimentais Conclusões. Introdução. Casamento de padrões possui várias aplicações: Editores de texto
E N D
Casamento de PadrõesUm Estudo Empírico Leonardo Teixeira Passos Thiago Henrique Braga
Sumário • Introdução • Definição do Problema • Algoritmos clássicos • Resultados Experimentais • Conclusões
Introdução • Casamento de padrões possui várias aplicações: • Editores de texto • Casamento de cadeias de DNA • Ampla literatura disponível • Vários algoritmos propostos • Melhorias de algoritmos anteriores
c b a c b a b a b a c b T s = 3 c b a b a P Definição Formal • Texto T[1 .. n] e Padrão P[1 .. m] • Tamanhos n e m, onde m ≤ n • Encontrar todos os deslocamentos s onde T[s+1 .. s+m] = P[1 .. m], com 0 ≤ s ≤ n – m
Algoritmos clássicos • Geralmente possuem duas fases: • Pré-processamento • Emparelhamento • Força Bruta • Rabin Karp • Knuth-Morris-Pratt • Boyer-Moore • Boyer-Moore-Horspool
Força Bruta • Método simples de casamento. • Não é inteligente o bastante para aproveitar caracteres já casados, quando acha um caracter em P que não pode ser casado em T.
Força Bruta • Desloca uma posição a cada nova iteração, independente de ter encontrado um casamento ou não. • O padrão desloca-se no texto como uma janela. • Complexidade: O(n2) .
Rabin Karp • Algoritmo que utiliza o conceito de hash. • É uma melhora do algoritmo de Força Bruta.
Rabin Karp • O algoritmo gera para o padrão P um código, digamos p, que é calculado uma única vez. • Exemplo:
Rabin Karp • Para cada porção do texto T a ser casada com P, gera-se o código de T, digamos t, que é então comparado com p;
Rabin Karp • No entanto, toda vez que se tenta casar uma nova porção de texto em T com P, o algoritmo utiliza o valor t’ da última iteração como parte do cálculo para o novo t.
Rabin Karp • Exemplo:
Rabin Karp • Retira-se a parte mais significativa do número, move o restante em um casa, e acrescenta o número referente ao novo caracter (parte menos significativa). • aba = t’ = 2562 * 97 + 256 * 98 + 97 • baa = t = t’ * 256 - 2563 + 97
Rabin Karp • O cálculo de t e p poderá envolver números que consomem uma grande quantidade de bits. • Como consequência, utiliza-se o operador `mod` nos cálculos intermediários, sem afetar o resultado final (`mod` aplicado ao resultado final).
Rabin Karp • O segundo operador da operação `mod` deverá ser um número primo grande, para evitar colisões.
Rabin Karp • Ao utilizarmos o operador de módulo, quando obtermos p q, então necessariamente garantimos que P[1 .. m] T[s+1 .. s+m], mas o contrário não é verdadeiro.
Rabin Karp • Assim, quando p = q é utilizada a comparação tal como o algoritmo de Força Bruta. • Conclui-se então, que o algoritmo de Rabin-Karp, no pior caso, também apresenta complexidade quadrática.
c b a a b a b a b a c b T s = 3 a b a b a c P c b a a b a b a b a c b T s’ = s+2 a b a b a c P KMP: Knuth-Morris-Pratt • Idéia: usar uma função prefixo • informar como o padrão se compara com seus próprios deslocamentos
KMP: Knuth-Morris-Pratt • Pré-processamento: calcular prefixo • Falha na tentativa de casamento: o algoritmo KMP consulta o vetor prefixo para evitar deslocamentos inválidos • Faz o deslocamento • Pré-processamento: O(m) • Emparelhamento: O(n)
KMP: Knuth-Morris-Pratt 1 2 3 4 5 6 7 8 9 10 a a a b a a b a a c a ab a a b a a b a ab
Boyer-Moore • Posiciona o padrão sobre o caracter mais a esquerda no texto • Busca da direita para a esquerda • Fase de pré-processamento: • Heurística-do-bom-sufixo • Heurística-do-mau-caracter • Falha na tentativa de casamento: escolhe-se o maior valor entre elas
b b a a b b a a b b a a c c b a a b c a a c T T a b a b c a a c b b c c b a a b a a a a c c c c P P P P 1 1 ... ... i i i+1 i+2 i+1 m m Boyer-MooreHeurística-do-bom-sufixo • Possui 2 casos • Primeiro: • Segundo: s s’ = s + 3 s s’ = s + 4
b a b d b a c b b a c T d d a a b b b b a a c c P P 1 ... i i+1 i+2 m Boyer-MooreHeurística-do-mau-caracter • Vetor BC[1 .. || ] • Cada posição do vetor armazena o índice da posição mais a direita de um caracter do padrão e -1 caso o caracter não ocorra no padrão s s’ = s+2
Boyer-Moore 1 2 3 4 5 6 7 8 9 10 a a a b a a b a a c a a b a a b a a b a a b
Boyer-Moore-Horspool • É uma simplificação sobre o algoritmo de Boyer-Moore, proposta por Horspool. • É mais eficiente, além consideravelmente mais simples de ser codificada.
Boyer-Moore-Horspool • Fase de pré-processamento: calcular o vetor de deslocamento (s):P = aca S[‘a’] = 1 e S[‘c’] = 2 • Demais posições de S são inicializadas com 0.
Boyer-Moore-Horspool • Deslocamento na fase de emparelhamento: a) deslocar o padrão para a posição onde se encontra o primeiro caracter (da direita para a esquerda) da porção corrente do texto T. Nessa posição i, existe um caracter c.
Boyer-Moore-Horspool • Deslocamento na fase de emparelhamento: b) reiniciar a tentativa de casamento a partir da posicão i’: i’ = i - (S[T[c]] - 1)
Boyer-Moore-Horspool • Melhor caso: O(n/m). Para isto, considera-se S[T[c]] = 0 na fórmula i’ = i - (S[T[c]] - 1), o que garantirá o a reinicialização do processo de tentativa de casamento a partir posição i + 1. • Caso médio: O(n/m) • Pior caso: O(nm)
Resultados Experimentais • Arquivo de teste: 1 Gb. • Padrão: bca • Texto: gerado aleatoriamente. Cada linha possui 1024 bytes.
Resultados Experimentais • Força BrutaNº de comparações: 1.115.541.632Tempo: 4:07.02 • Rabin KarpNº de comparações: 1.073.487.466Tempo: 4:17.76
Resultados Experimentais • KMPNº de comparações: 916.030.648Tempo: 4:04.54
Resultados Experimentais • Boyer-MooreNº de comparações: 387.603.550Tempo: 3:51.40 • Boyer-Moore-HorspoolNº de comparações: 387.603.550Tempo: 3:35.41
Conclusões • Escolha criteriosa do valor q no Rabin Karp muitas colisões • Desempenho KMP superior ao Rabin Karp e Força Bruta • Deslocamentos mais eficientes:Boyer-Moore e Boyer-Moore-Horspool • Melhor tempo de execução:Boyer-Moore-Horspool