Есть ли способ оптимизировать алгоритм KMP, чтобы задействовать сравниваемый символ? - PullRequest
0 голосов
/ 16 апреля 2020

Я заметил, что алгоритм KMP просто обращается к функции сбоя, когда обнаруживает несоответствие в Haystack [a] и Needle [b], но никогда не смотрит на то, что такое Needle [b]. Можно ли сделать KMP быстрее, если мы рассмотрим, что такое Needle [b]?

1 Ответ

0 голосов
/ 17 апреля 2020

В принципе, вы можете обновить KMP, чтобы таблица сбоев смотрела на входной символ, вызвавший несоответствие. Однако возникает вопрос, сколько это будет стоить вам, и какую выгоду вы получите от этого.

Одним из преимуществ KMP является то, что этап предварительной обработки занимает время O (n) где n - длина строки шаблона. Нет зависимости от количества символов, из которых состоит строка (например, Unicode, ASCII и т. Д. c.). Простое построение таблицы, связывающей каждый символ с тем, что делать в некоторых обстоятельствах, может негативно повлиять на время выполнения шага предварительной обработки.

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

...