В настоящее время я изучаю алгоритмы сопоставления образов и сталкиваюсь с этими двумя алгоритмами. У меня есть следующие общие идеи:
КМР
- Сравнивает текст слева направо
- Использование массива сбоев для интеллектуального переключения
- принимает O (m), где m - длина шаблона, для вычисления массива отказов
- принимает O (m), пространство
- принимает O (n), время поиска строки
ВМ
- Сравнивает шаблон с последним символом
- Использует неудачные прыжки персонажа и прыжки хорошего суффикса
- принимает O (m + размер алфавита) для вычисления таблиц
- принимает O (m + размер алфавита), пробел
- принимает O (n), но обычно лучше искать
Я наткнулся на следующий вопрос, который вызвал этот вопрос (True или False):
Алгоритм Knuth-Morris-Pratt (KMP) - хороший выбор, если мы хотим повторите поиск одного и того же шаблона во многих разных текстах.
Итак, я верю, что ответ верен только потому, что предполагается, что каждый раз, когда вы запускаете алгоритм на другом тексте, предварительная обработка - это только O (n), где для BM это O (n + размер алфавита). Тем не менее, я не уверен, принимаю ли я правильное предположение, что каждый раз, когда алгоритм повторно запускается, новая таблица пересчитывается. Потому что текст всегда попадает в алфавит на английском языке. Мне нужно было бы только вычислить таблицу один раз и просто повторно использовать таблицу. Итак, в конце концов, будет ли ответ на этот вопрос зависеть от того, что все алгоритмы выполняются по тексту, который содержится в одном и том же алфавите, или есть какой-то другой фактор, который может повлиять на него?