Изменения

Перейти к: навигация, поиск
Метод хеширования
==Метод хеширования==
Для решения задачи удобно использовать полиномиальный хеш[[Наивный алгоритм поиска подстроки в строке]] работает за <tex>O\left(n^2\right)</tex> в худщем случае - слишком долго. Чтобы ускорить этот процесс, так его легко пересчитывать: можно воспользоваться методом хеширования.{{Определение|definition = Пусть дана строка <tex>s[1 \ldots n]</tex>. Тогда полиномиальным хешем строки <tex>s</tex> называется число <tex>h = \mathrm{hash}(s[1..n]) = (p^{n - 1} s[1] + ... + p^{0} s[n]) \bmod r</tex>, где <tex>p</tex> {{---}} это некоторое простое натуральное число, а <tex>rs[i]</tex> {{--код <tex>i</tex>-ого символа строки <tex>s</tex>.}} некоторое большое число, для уменьшения числа коллизий (обычно берётся Проблему переполнения при вычислении хешей довольно больших строк можно решить так: будем считать хеши по модулю <tex>2^{32}r</tex> или - некоторому большому числу (будем брать <tex>r =2^{64}</tex>, чтобы модуль брался автоматически при переполнении типов). Стоит обратить вниманиеЧисло <tex>p</tex> для их подсчета должно быть, во-первых, больше кода самого большого символа в строках, а во-вторых, что если взаимно простым с модулем (в нашем случае — с 2 строчки имеют одинаковый хеш^{64}, то они в большинстве таких случаев равныт.е. оно должно быть нечетным).
При удалении первого символа строки и добавлении символа в конец считать хеш новой строки при помощи хеша изначальной строки возможно за <tex>O(1)</tex>:
Анонимный участник

Навигация