![]() |
|||
Полиномиальное хешированиеПусть ![]() где
![]() ![]() ![]() Хеши обладают следующим свойством: у одинаковых строк хеши обязательно равны. Поэтому, если хеши для некоторых строк уже вычислены, то мы можем сравнить их за Алгоритм Рабина-КарпаВ качестве примера применения полиномиального хеширования рассмотрим задачу поиска подстроки в строке. Пусть нам требуется найти все вхождения строки Вычислим сначала хеши для всех префиксов строки ![]() Вычислим теперь хеш для строки
![]() ![]() ![]() ![]() Реализация алгоритма на языке С++: std::vector<unsigned long long> pows(n1);
pows[0] = 1;
for (int i = 1; i < (int)pows.size(); i++) {
pows[i] = pows[i - 1] * P;
}
std::vector<unsigned long long> hashes(n1 + 1);
hashes[0] = 0;
for (int i = 1; i < (int)hashes.size(); i++) {
hashes[i] = hashes[i - 1] + s1[i - 1] * pows[i - 1];
}
unsigned long long s2Hash = 0;
for (int i = 1; i <= n2; i++) {
s2Hash += s2[i - 1] * pows[i - 1];
}
std::vector<int> positionsOfs2;
for (int i = 0; i + n2 <= n1; i++) {
if (pows[i] * s2Hash == hashes[i + n2] - hashes[i]) {
positionsOfs2.push_back(i);
}
}
В реализации взятие по модулю
![]() ![]() ![]() ![]() |
|||
|
|||
|