Введение

Алгоритм поиска строк, доказатель теоремы Бойера-Мура

В информатике алгоритм поиска строк Бойера-Мура — это эффективный алгоритм поиска строк, являющийся стандартным эталоном для практической литературы по поиску строк. Он был разработан Робертом С. Бойером и Дж. Стротером Муром в 1977 году. Оригинальная статья содержала статические таблицы для вычисления сдвигов образца без объяснения того, как их создавать. Алгоритм для создания таблиц был опубликован в последующей работе; эта статья содержала ошибки, которые позже были исправлены Войцехом Риттером в 1980 году. Алгоритм предварительно обрабатывает строку, которую необходимо найти (образец), но не строку, в которой производится поиск (текст). Таким образом, он хорошо подходит для приложений, в которых образец значительно короче текста или сохраняется при множественных поисках. Алгоритм Бойера-Мура использует информацию, полученную на этапе предварительной обработки, чтобы пропускать части текста, что приводит к меньшему постоянному множителю, чем у многих других алгоритмов поиска строк. В целом, алгоритм работает быстрее по мере увеличения длины образца. Ключевые особенности алгоритма — сопоставление по концу образца, а не по началу, и пропуск по тексту с шагом в несколько символов, а не поиск каждого символа в тексте.

Выступление

Алгоритм Бойера-Мура, представленный в оригинальной статье, имеет время выполнения в худшем случае O(n+m) только если образец не встречается в тексте. Это было впервые доказано Кнутом, Моррисом и Праттом в 1977 году, с верхней границей в 5n сравнений в худшем случае. Ричард Коул в 1991 году предоставил доказательство с верхней границей в 3n сравнений в худшем случае. Когда образец встречается в тексте, время выполнения исходного алгоритма в худшем случае составляет O(nm). Это легко увидеть, когда и образец, и текст состоят исключительно из одного и того же повторяющегося символа. Однако, включение правила Галиля обеспечивает линейное время выполнения во всех случаях.

Варианты

Алгоритм Бойера-Мура-Горспола является упрощением алгоритма Бойера-Мура, использующим только правило плохого символа. Алгоритм Апостолико-Джанкарло ускоряет процесс проверки наличия соответствия при заданном выравнивании, избегая явного сравнения символов. Он использует информацию, полученную при предварительной обработке шаблона, в сочетании с длиной совпадения суффикса, фиксируемой при каждой попытке сопоставления. Хранение длин совпадения суффикса требует дополнительную таблицу, размер которой равен размеру искомого текста. Алгоритм Райты повышает эффективность алгоритма Бойера-Мура-Горспола. Способ поиска конкретной подстроки в заданной строке отличается от алгоритма Бойера-Мура-Горспола.