DEV//UNIT

Кнут-Моррис-Пратт (KMP)

Префикс-функция запоминает, где образец совпадает сам с собой, — текст сканируется без откатов.

время O(n + m)память O(m)уровень: средний
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
1function buildPrefixFunction(p: string): number[] {
2 const pi = [0]
3 let k = 0
4
5 for (let i = 1; i < p.length; i++) {
6 while (k > 0 && p[i] !== p[k]) k = pi[k - 1]!
7 if (p[i] === p[k]) k++
8 pi[i] = k
9 }
10
11 return pi
12}
13
14function kmpSearch(text: string, p: string): number[] {
15 const pi = buildPrefixFunction(p)
16 const found: number[] = []
17 let k = 0
18
19 for (let i = 0; i < text.length; i++) {
20 while (k > 0 && text[i] !== p[k]) k = pi[k - 1]!
21 if (text[i] === p[k]) k++
22 if (k === p.length) {
23 found.push(i - p.length + 1)
24 k = pi[k - 1]!
25 }
26 }
27
28 return found
29}

Проблема

Префикс-функция запоминает, где образец совпадает сам с собой, — текст сканируется без откатов.

Что вы видите

Сначала π-массив образца: длины совпадающих префикс/суффикс. Затем по тексту: несовпадение прыгает по π, а не в начало.

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

Наивный поиск откатывает позицию в тексте; KMP — никогда. π[k] говорит: после несовпадения образец уже совпал первыми π символами — продолжай с них. Ровно один проход, O(n + m).

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

  1. 01

    π-функция

    Где образец совпадает сам с собой.

  2. 02

    Сканирование

    Несовпадение → прыжок по π.

  3. 03

    Один проход

    i по тексту только вперёд.

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

time
O(n + m)
space
O(m)

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

Edge cases

  • Пустой вход

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

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

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

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

Ctrl+F

Быстрый поиск в редакторах и логах.

Биоинформатика

Поиск мотивов в ДНК-последовательностях.

IDS/антивирусы

Сканирование трафика по сигнатурам без откатов.

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

Shorts

«Поиск, который никогда не откатывается»

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

Shorts 9:16

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

Поиск, который никогда не откатывается
Нажмите Play
Бит 1/6 · 0–2 с
Hook
script-setup.ru/algorithms/kmp