Рабин-Карп
Скользящий хеш: окно бежит по тексту, числа сравниваются за O(1).
1function rabinKarp(text: string, pattern: string): number[] {2 const base = 256, mod = 1013 const m = pattern.length4 const found: number[] = []5 6 let ph = 0, th = 07 for (let i = 0; i < m; i++) {8 ph = (ph * base + pattern.charCodeAt(i)) % mod9 th = (th * base + text.charCodeAt(i)) % mod10 }11 12 for (let i = 0; i + m <= text.length; i++) {13 if (th === ph && text.slice(i, i + m) === pattern) found.push(i)14 // скользящий пересчёт: выкидываем левую букву, добавляем правую15 if (i + m < text.length) {16 th = (th - text.charCodeAt(i) * base ** (m - 1)) * base17 th = (th + text.charCodeAt(i + m)) % mod18 }19 }20 21 return found22}Проблема
Скользящий хеш: окно бежит по тексту, числа сравниваются за O(1).
Что вы видите
Окно фиксированной ширины: вычли уходящую букву, прибавили входящую — новый хеш без пересчёта.
Как это работает
Полиномиальный хеш окна пересчитывается за O(1) на сдвиг. Равенство хешей — повод сверить буквы (защита от коллизий). Один приём ищет много образцов сразу.
Пошаговый разбор
- 01
Хеш образца
Считается один раз.
- 02
Скользящий хеш
Окно обновляется за O(1).
- 03
Совпадение
Хеши равны — сверяем буквы.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Антиплагиат
Поиск фрагментов текста по хешам предложений.
rsync
Блоки файла сравниваются скользящими хешами.
Мульти-поиск
Набор сигнатур вирусов одним проходом.
Связанные алгоритмы
«Сравнить числа вместо букв: поиск за O(n + m)»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.