DEV//UNIT

Рабин-Карп

Скользящий хеш: окно бежит по тексту, числа сравниваются за O(1).

время O(n + m) в среднемпамять O(1)уровень: средний
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
1function rabinKarp(text: string, pattern: string): number[] {
2 const base = 256, mod = 101
3 const m = pattern.length
4 const found: number[] = []
5
6 let ph = 0, th = 0
7 for (let i = 0; i < m; i++) {
8 ph = (ph * base + pattern.charCodeAt(i)) % mod
9 th = (th * base + text.charCodeAt(i)) % mod
10 }
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)) * base
17 th = (th + text.charCodeAt(i + m)) % mod
18 }
19 }
20
21 return found
22}

Проблема

Скользящий хеш: окно бежит по тексту, числа сравниваются за O(1).

Что вы видите

Окно фиксированной ширины: вычли уходящую букву, прибавили входящую — новый хеш без пересчёта.

Как это работает

Полиномиальный хеш окна пересчитывается за O(1) на сдвиг. Равенство хешей — повод сверить буквы (защита от коллизий). Один приём ищет много образцов сразу.

Пошаговый разбор

  1. 01

    Хеш образца

    Считается один раз.

  2. 02

    Скользящий хеш

    Окно обновляется за O(1).

  3. 03

    Совпадение

    Хеши равны — сверяем буквы.

Complexity и ограничения

time
O(n + m) в среднем
space
O(1)

Сложность см. в шапке страницы.

Edge cases

  • Пустой вход

    Корректная тривиальная обработка.

  • Вырожденный случай

    Минимум работы — сразу ответ.

Где встречается в реальности

Антиплагиат

Поиск фрагментов текста по хешам предложений.

rsync

Блоки файла сравниваются скользящими хешами.

Мульти-поиск

Набор сигнатур вирусов одним проходом.

Связанные алгоритмы

Shorts

«Сравнить числа вместо букв: поиск за O(n + m)»

Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.

Shorts 9:16

Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.

Сравнить числа вместо букв: поиск за O(n + m)
Нажмите Play
Бит 1/6 · 0–2 с
Hook
script-setup.ru/algorithms/rabin-karp