Dificuldade ★★☆
3 minutos de Leitura 🕒
O Algoritmo KMP (Knuth-Morris-Pratt) é um algoritmo de casamento de padrões criado por Donald Knuth, James Morris e Vaughan Pratt em 1970. O algoritmo possui um desempenho superior ao Algoritmo Força-Bruta, pois evita verificações redundantes ao longo da busca. Para isso, o Algoritmo KMP constrói um autômato finito determinístico capaz de reconhecer o padrão buscado e, então, simula a execução desse autômato ao longo do texto de entrada.
P
o padrão buscado com comprimento k
, e T
o texto de entrada com comprimento m
.DFA[i, j]
capaz de reconhecer o padrão buscado. Nessa estrutura auxiliar, as linhas codificam um “símbolo de entrada”, colunas codificam o estado atual no autômato e os valores armazenados nas células da tabela codificam o próximo estado no autômato.0
o estado atual x
no autômato DFA
.T[i]
no texto de entrada T
faça:x ← DFA[T[i], i]
k
, saia do laço.k
o padrão foi encontrado. Caso contrário, o padrão não foi encontrado no texto de entrada.x
que indica o estado de recomeço no autômato.DFA[R, k]
, que possui R
linhas e k
colunas, sendo R
o número de símbolos alfabeto de busca (por exemplo letras, número e símbolos especiais para uma busca textual) e k
o comprimento do padrão buscado.DFA[R, k]
com x
, indicando que, qualquer descasamento entre um símbolo no padrão buscado e um símbolo no texto de entrada, o autômato recomeça de seu estado inicial.DFA[P[0], 0] ← 1
.P[i]
no padrão P
, começando do segundo símbolo faça:i
no autômato copiando a transições do estado anterior: DFA[c, i] ← DFA[c, x]
, onde c
são todos os símbolos em R
.i
, quando símbolo P[i]
é lido: DFA[P[i], i] ← i + 1
.x ← DFA[P[i], x]
.O melhor caso para o algoritmo KMP acontece quando o padrão buscado encontra-se logo no início do texto de entrada. Nesse cenário o desempenho do algoritmo é linear no número de comparações, em função do comprimento k
do padrão buscado:
O(k)
comparaçõesO pior caso para o Algoritmo KMP acontece quando o padrão buscado não está no texto de entrada. Nesse cenário, o desempenho do algoritmo é linear no número de comparações, em função do comprimento k
do padrão buscado e do comprimento m
do texto de entrada:
O(m + k)
comparaçõesVeja o código completo no GitHub.