Интерфейс strstr налагает некоторые ограничения, которые могут быть побеждены.Он принимает строки с нулевым символом в конце, и любой конкурент, который первым сделает "стрельбу" своей цели, потеряетОн не требует аргумента «состояние», поэтому затраты на настройку нельзя амортизировать для многих вызовов, скажем, с одной и той же целью или шаблоном.Ожидается, что он будет работать с широким диапазоном входных данных, включая очень короткие цели / паттерны и патологические данные (рассмотрите возможность поиска «ABABAC» в строке «ABABABABAB ... C»).libc также теперь зависит от платформы.В мире x86-64 SSE2 уже семь лет, а strlen и strchr в libc, использующие SSE2, в 6-8 раз быстрее наивных алгоритмов.На платформах Intel, поддерживающих SSE4.2, strstr использует инструкцию PCMPESTRI.Но вы можете и это побить.
У Бойера-Мура (и Turbo BM, и Backward Oracle Matching, и др.) Есть время установки, которое в значительной степени выбивает их из строя, даже не считая нользаданная строка.Хорспул - ограниченный БМ, который хорошо работает на практике, но плохо справляется с крайними случаями.Лучшее, что я нашел в этом поле, - это BNDM («Обратное недетерминированное направленное ациклическое сопоставление слов-графов»), реализация которого меньше его имени: -)
Вот несколько фрагментов кода, которые могутпредставлять интерес. Интеллектуальный SSE2 превосходит наивный SSE4.2 и обрабатывает проблему нулевого завершения. Реализация BNDM показывает один из способов сохранения затрат на настройку.Если вы знакомы с Horspool, вы заметите сходство, за исключением того, что BNDM использует битовые маски вместо пропусков.Я собираюсь опубликовать, как решить проблему с нулевым терминатором (эффективно) для суффиксных алгоритмов, таких как Horspool и BNDM.
Общим признаком всех хороших решений является разбиение на разные алгоритмы для разных длин аргументов.Примером является функция "Рейлган" Санмейса .