Algoritmo de Rabin-Karp - Artigo

956 views
845 views

Published on

Artigo sobre Algoritmo de Rabin-Karp para busca de string, Artigo realizado para a matéria de Projeto de Analise de Algorítimos da Universidade de Vila Velha. Alunos: Lorran Pegoretti e Matheus Lani Regattieri Arrais.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
956
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Algoritmo de Rabin-Karp - Artigo

  1. 1. ANÁLISE DO ALGORITMO DE RABIN-KARPLorran PegorettiMatheus Lani Regattieri ArraisResumo: Este trabalho apresenta um estudo do algoritmo de busca exata em texto criado por MichaelO. Rabin e Richard M. Karp. O Algoritmo Rabin-Karp tem característica probabilística, pois eletransforma a palavra procurada em um número, seguindo determinadas regras. O algoritmo tenta evitara comparação de todos os caracteres através da comparação entre o hash da janela e do padrão.Palavras-chave: Algoritmo de Rabin-Karp, Tabela Hash, Comparação de Strings.INTRODUÇÃO E DESCRIÇÃO DO ALGORITMOComo citado anteriormente, o Algoritmo Rabin-Karp tem característica probabilística, pois eletransforma a palavra procurada em um número, seguindo determinadas regras, que serão apresentadasposteriormente. Para a descrição do algoritmo será utilizada a seguinte notação: n: número de caracteres do texto; m: número de caracteres da palavra; d: cardinalidade do alfabeto ∑ q: número primo, como: 16647133; T: string do texto;P: string da palavra.Harrison (1971) [Cor97] sugeriu o uso de técnicas de hashing as quais são utilizadas nestealgoritmo para resgatar palavras de uma string, proposto por Rabin-Karp. Tudo que é necessário éprocessar a função de assinatura de cada substring de m-caracteres no texto e checar se é igual àassinatura da função da palavra procurada.Karp e Rabin encontraram uma forma fácil para processar estas funções de assinaturaeficientemente para a função h(k) = k mod q, onde q é um número primo grande. O método é baseadono processamento da função de assinatura para a posição i dando o valor para a posição i – 1. Oalgoritmo requer tempo proporcional a n + m em quase todos os casos, isto não utilizando memóriavirtual. Note-se que este algoritmo encontra posições no texto que tem o mesmo valor de assinaturaque a palavra. Para garantir a busca, deve-se fazer uma comparação direta entre a palavra e a substring.
  2. 2. Este algoritmo, usa um elevado valor para q fazendo com que as colisões diminuam. A probabilidadede uma colisão aleatória é O(1/q).Teoricamente, este algoritmo pode ainda requerer mn passos no pior caso, checando cada buscaem potencial. Em testes realizados verificou-se que apenas 3 colisões em 107[Cor97] processamentosde assinaturas, usando grandes alfabetos (∑).A função de assinatura representa a string como um número na base-d, onde d é o número decaracteres possíveis. Para obter o valor de assinatura da próxima posição, apenas um valor constantede operações é necessário.Na pratica, este algoritmo é lento para as duas operações de multiplicação e modulo. Entretanto,ele se torna computacionalmente viável para grandes palavras.PSEUDOCÓDIGOFigura 1: Pseudocódigo do Algoritmo de Rabin Karp (Forma Genérica [Cor97])O algoritmo pode ser dividido da seguinte maneira: Correspondente às linhas [1-5]. Este bloco apresenta instruções de inicialização dasvariáveis utilizadas no código. É importante ressaltar que a implementação da função hashé arbitraria; Correspondente às linhas [6-8]. Este bloco constitui-se de uma iteração com índicerelacionado à cardinalidade da palavra. O bloco inicializa o hash(p) da palavra e do texto,hash(t); Correspondente às linhas [9-14]. Neste bloco tem-se a iteração de comparação; na linha 10em caso da comparação ser válida tem a possibilidade da substring encontrada ser a
  3. 3. procurada. Observa-se que esta linha apresenta o caráter probabilístico do algoritmo. Umacomparação extra é realizada para confirmar o resultado; não comparando a hash como naanterior, mas os caracteres da substring com a palavra.Em caso negativo da comparação, temos um novo valor de hash(t) para a substring,realizando a iteração até encontrar a palavra(s) ou se esgotar o texto.COMPLEXIDADEA complexidade deste algoritmo, no seu pior caso, é O((n – m + 1)m), podendo ser reduzida aO(nm), este caso ocorreria quando o número de colisões fosse elevado, o que obrigaria o algoritmo arealizar um maior número de comparações e operações para se obter um novo valor de hash(t). Nosdemais casos, médio e melhor, este algoritmo trabalha em O(m + n). A prova para estes casos écomplicada, devido principalmente ao caráter probabilístico deste algoritmo, pode-se obterdemonstração em [Cor97].Apesar de ser probabilístico este algoritmo não se apresenta eficiente na busca de textos que estejamem constante mudança, já para textos que não são modificados constantemente ele poderá apresentarum desempenho melhor devido ao aproveitamento da tabela hash, para encontrar estas palavras.CONCLUSÃOO algoritmo de Rabin-Karp tenta diminuir o número de comparações através do cálculo deum hash da palavra procurada e da substring, porem através deste procedimento ele se tornaprobabilístico. O algoritmo é válido para qualquer alfabeto, bastando apenas interpretar cadacaractere como um dígito, e na prática tem um bom desempenho principalmente na busca de palavrasgrandes em textos que não estão em constante mudança.REFERÊNCIAS BIBLIOGRÁFICAS [Cor97] Cormen, T., Leiserson, C., e Rivest, R. 1997. “Introduction to Algortihms”, em TheRabin-Karp algorithm, pp. 857-883. BAEZA-YATES, R., Frakes, W. 1992. “Information Retrieval Data Strucures & Algorithms”em String Searching Algorithms,pp. 219-237. http://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm

×