Eu tenho lido sobre o algoritmo Rabin Karp e fiquei pensando qual é o grande problema em manter nossos valores de hashes rotativos limitados por um valor Q?
Eu pensava que, como nossa representação de número inteiro no computador típico é de 2 complementos, na verdade é exatamente equivalente a limitar todas as nossas operações sobre os hashes rotativos por 2 ^ 31, de modo que, em outras palavras, eu simplesmente não deveria me importar. Além disso, quanto menor o limite ou o hash, mais colisões teríamos, portanto, um Q maior seria igual ao desempenho aprimorado!
Eu tentei codificar uma implementação simples (Java):
public static int rabinKarp(String text, String pattern) {
if (text.length() < pattern.length()) {
return -1;
} else {
int patternHash = 0;
int textHash = 0;
int pow = 1;
// preprocessing the pattern and the first characters of the text string
for (int i = pattern.length()-1; i >= 0; --i) {
patternHash += pattern.charAt(i) * pow;
textHash += text.charAt(i) * pow;
pow *= 10;
}
pow /= 10;
// actual search
if (patternHash == textHash && areEqual(text, 0, pattern)) {
return 0;
} else {
for (int i = 1; i < text.length()-pattern.length()+1; ++i) {
textHash -= text.charAt(i-1)*pow;
textHash *= 10;
textHash += text.charAt(i+pattern.length()-1);
if (textHash == patternHash && areEqual(text, i, pattern)) {
return i;
}
}
return -1;
}
}
}
A partir de alguns testes preliminares, minha hipótese parece ser empiricamente precisa, mas ainda não a vi escrita em lugar algum, por isso fico pensando ..
Estou esquecendo de algo?