Строки: база, полиномиальные хеши (19 апреля 2016)
- Определения: подстрока, суффикс, префикс, период
- Поиск подстроки в строке
- C++ : string.find(string), O(n2)
- Префикс функция
- Z-функция
--- Перерыв ---
- Алгоритм Боера-Мура'77 (и его модификация Чжу-Такаоки'87!)
- Полиномиальный хеш строки
- Цель: отобразить строки в целые числа, чтобы сравнивать их на равенство за O(1)
- Вычисление хеша: h[i+1] = h[i]*P + s[i] ; substr(i, len) = h[i+len] - h[i]*deg[len]. При P > |Σ| инъекция. А теперь вычисления делаем по модулю.
- Коллизии: Pr(s1,...,sn различны → h1,...hn различны) ≥ 1 - n(n-1)/(2M)
- Хеши, вероятности
- Lm: если (P,MOD) фиксировано, MOD простое, мы берём случайный многочлен, то вероятность, что P − корень, равна 1/MOD
- Lm: если многочлен и MOD фиксированы, MOD простое, мы берём случайное P, то вероятность, что P − корень, ≤ degree/MOD
- Lm: если MOD фиксирован, MOD простое, мы берём случайное P и случайный многочлен, то вероятность, что P − корень равна 1/MOD
- Анонс "строка Туэ-Морса", "тест против (P,MOD)-хеша".
- Что делать с коллизиями? Выбирать случайную точку P или случайный простой MOD! Лучше P.