Бойер-Мур
Сравниваем справа налево, сдвигаем по таблице последнего символа — часто быстрее длины текста.
1function boyerMoore(text: string, p: string): number[] {2 // таблица плохого символа: крайний правый индекс буквы в образце3 const bad = new Map<string, number>()4 ;[...p].forEach((ch, i) => bad.set(ch, i))5 6 const found: number[] = []7 let i = 08 while (i + p.length <= text.length) {9 let j = p.length - 110 while (j >= 0 && text[i + j] === p[j]) j-- // справа налево!11 if (j < 0) {12 found.push(i)13 i++14 } else {15 // сдвиг по несовпавшей букве окна16 const shift = Math.max(1, j - (bad.get(text[i + j]) ?? -1))17 i += shift18 }19 }20 21 return found22}Проблема
Сравниваем справа налево, сдвигаем по таблице последнего символа — часто быстрее длины текста.
Что вы видите
Окно смотрит последней буквой; несовпавший символ говорит, насколько прыгать.
Как это работает
Эвристика плохого символа: если буква окна отсутствует в образце — сдвиг на всю длину образца. На больших алфавитах Бойер-Мур читает малую часть текста.
Пошаговый разбор
- 01
Справа
Сравнение с последней буквы.
- 02
Таблица
Где каждая буква в образце.
- 03
Прыжок
Сдвиг по несовпавшей букве.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
grep
Реализация в GNU grep.
Антивирусы
Сканирование файлов по сигнатурам.
Редакторы
Search в больших файлах.
Связанные алгоритмы
«Поиск, который читает текст через слово»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.