Ответ 1
Это комбинация Boyer-Moore и Horspool.
Вы можете просмотреть код C здесь:
Быстрая реализация поиска/подсчета, основанная на смеси между Бойер-Муром и Хорспулом, с еще несколькими колокольчиками и свистами на вершине. Для получения дополнительной информации см. Раздел http://effbot.org/zone/stringlib.htm.
Из приведенной выше ссылки:
При разработке нового алгоритма я использовал следующие ограничения:
- должен быть быстрее, чем текущий алгоритм грубой силы для всех тестовых случаев (основанный на реальном коде), включая худший случай с Джим Хьюгунином
- небольшие накладные расходы; нет динамического распределения в быстром пути (O (m) для скорости, O (1) для хранения)
- сублинейное поведение поиска в хороших случаях (O (n/m))
- не хуже текущего алгоритма в худшем случае (O (nm))
- должен хорошо работать как для 8-битных строк, так и для 16-разрядных или 32-разрядных строк Unicode (без зависимостей O (σ))
- многие поиски в реальной жизни должны быть хорошими, очень немногие должны быть в худшем случае разумно простая реализация