Когда Рабин Карп более эффективен, чем КМП или Бойер-Мур? - PullRequest
1 голос
/ 02 июня 2019

Я изучаю алгоритмы поиска строк и понимаю, как они работают, но не нашел достаточно хорошего ответа о том, в каких случаях алгоритм Рабина-Карпа будет более эффективным, чем KMP или Бойера-Мура.Я вижу, что это легче реализовать и не требует тех же накладных расходов, но кроме этого, я понятия не имею.

Итак, когда Рабин-Карп лучше использовать, чем другие?

1 Ответ

2 голосов
/ 03 июня 2019

У каждого из этих алгоритмов есть пара свойств, которые могут сделать их желательными или нежелательными в различных обстоятельствах.Вот краткое изложение:

Космическое использование благоприятствует Рабину-Карпу

Одним из основных преимуществ Рабина-Карпа является то, что он использует O (1) вспомогательного пространства для хранения, что хорошо, если вы используете строку шаблонаИщите очень большой.Например, если вы ищете все вхождения строки длиной 10 7 в более длинной строке длиной 10 9 , не нужно выделять таблицу 10 7 машинных слов для функции сбоя или таблицы смены - главный выигрыш.Как Бойер-Мур, так и KMP используют память Ω (n) для последовательности шаблонов длины n, поэтому Рабин-Карп выиграл бы здесь явно.

Рабин-Карп страдает от двух потенциально худших случаев.Во-первых, если конкретное простое число, используемое Рабином-Карпом, известно злонамеренному злоумышленнику, этот злоумышленник может потенциально создать вход, который заставляет скользящий хеш соответствовать хешу строки шаблона в каждый момент времени, что приводит к снижению производительностиухудшиться до Ω ((m - n + 1) n) на строке длиной m и образцом длины n.Если вы берете ненадежные строки в качестве входных данных, это может быть проблемой.Ни Бойер-Мур, ни KMP не имеют этих недостатков.

Эффективность множественных совпадений в наихудшем случае благоприятствует KMP.

Аналогично, Рабин-Карп работает медленно, если вы хотите найти все совпадениястрока шаблона в случае, когда этот шаблон появляется большое количество раз.Например, если вы ищете строку из 10 5 копий письма a в текстовой строке, состоящую из 10 9 копий письма a с Rabin-Карп, тогда будет много мест, где появится строка шаблона, и для каждого потребуется линейное сканирование.Это также может привести к времени выполнения Ω ((m + n - 1) n).

Многие реализации Бойера-Мура страдают от этого второго правила, но не будут иметь плохие времена выполнения в первом случае.И у KMP нет таких патологических наихудших случаев, как эти.

Лучшая производительность способствует Бойеру-Муру

Одним из преимуществ алгоритма Бойера-Мура является то, что он не обязательно должен сканировать всесимволы входной строки.В частности, правило неверных символов может использоваться для пропуска огромных областей входной строки в случае несоответствия.В частности, наилучшим временем выполнения для Бойера-Мура является O (m / n), что намного быстрее, чем может обеспечить Rabin-Karp или KMP.

Обобщения для множественных строк поддерживают KMP

Предположим, у вас есть фиксированный набор из нескольких текстовых строк, которые вы хотите искать, а не только одна.Вы можете, если хотите, запустить несколько проходов Рабина-Карпа, KMP или Бойера-Мура по всем строкам, чтобы найти все совпадения.Тем не менее, время выполнения этого подхода невелико, так как он линейно масштабируется с количеством строк для поиска.С другой стороны, KMP хорошо обобщает алгоритм сравнения строк Aho-Corasick, который выполняется за время O (m + n + z), где z - количество найденных совпадений, а n - объединенная длина строк шаблона.Обратите внимание, что здесь нет зависимости от количества искомых строк шаблона!

...