Я думаю, что концептуально понимаю алгоритм сопоставления с образцом RabinKarp с использованием скользящего хеша. Просматривая пример реализации здесь, я обнаружил, что большое простое число число q
добавляется к ранее вычисленному скользящему хешу.
for (int i = m; i < n; i++) {
// Remove leading digit, add trailing digit, check for match.
txtHash = (txtHash + q - RM*txt.charAt(i-m) % q) % q; //Why +q here?
txtHash = (txtHash*R + txt.charAt(i)) % q;
// match
int offset = i - m + 1;
if ((patHash == txtHash) && check(txt, offset))
return offset;
}
Я не уверен, зачем это нужно. Могу я получить помощь с этим?
В моем ограниченном тестировании я получаю тот же результат независимо от того, включен ли q
термин.
Связано ли это с тем, какая версия алгоритма (Монте-Карло / Лас-Вегас) реализуется?
+ q
мне тоже кажется ошибкой, чего бы это ни стоило. - person 500 - Internal Server Error   schedule 22.05.2019+q
? - person bp4D   schedule 22.05.2019