Каковы основные различия между поисковыми алгоритмами Кнута-Морриса-Пратта и Бойера-Мура?

Каковы основные различия между поисковым алгоритмом Кнута-Морриса-Пратта и поисковым алгоритмом Бойера-Мура?

Я знаю, что KMP ищет Y в X, пытается определить шаблон в Y и сохраняет шаблон в векторе. Я также знаю, что BM лучше подходит для небольших слов, таких как ДНК (ACTG).

Каковы основные различия в том, как они работают? Какой из них быстрее? Какой из них менее жадный к компьютерам? В каких случаях?


person ghaschel    schedule 29.09.2012    source источник
comment
BM лучше работает с естественным текстом, а не с небольшими наборами   -  person gtgaxiola    schedule 30.09.2012


Ответы (3)


на веб-странице Мура в UTexas пошагово рассматриваются оба алгоритма (он также предоставляет различные технические источники):

По словам самого мужчины,

Классический алгоритм Бойера-Мура страдает тем явлением, что он не так эффективно работает с маленькими алфавитами, такими как ДНК. Расстояние пропуска имеет тенденцию перестать расти вместе с длиной шаблона, потому что подстроки часто повторяются. Запоминая больше того, что уже было сопоставлено, можно увеличить пропуски текста. Можно даже организовать `` идеальную память '' и, таким образом, смотреть на каждый символ не более одного раза, тогда как алгоритм Бойера-Мура, хотя и линейный, может проверять символ из текста несколько раз. Идея запоминания большего была исследована в литературе другими. Он страдает от необходимости в очень больших таблицах или конечных автоматах.

Однако были некоторые модификации BM, которые сделали поиск по малому алфавиту жизнеспособным. .

person David Titarenco    schedule 29.09.2012

В грубом объяснении

Подход Бойера-Мура состоит в том, чтобы попытаться сопоставить последний символ шаблона, а не первый, с предположением, что, если нет совпадения в конце, нет необходимости пытаться сопоставить в начале. Это позволяет делать "большие скачки", поэтому BM работает лучше, когда узор и текст, который вы ищете, похожи на "естественный текст" (т. Е. На английском языке).

Knuth-Morris-Pratt ищет вхождения слова W в основной «текстовой строке» S, используя наблюдение, что, когда возникает несоответствие, само слово содержит достаточно информации, чтобы определить, где следующее совпадение может начаться, минуя повторную проверку ранее сопоставленных символов. (Источник: Wiki)

Это означает, что KMP лучше подходит для небольших наборов, таких как ДНК (ACTG).

person gtgaxiola    schedule 29.09.2012
comment
Я не понимаю, почему было бы лучше сопоставить сначала последние символы. Если это не удастся, вам все равно придется двигаться вперед на одного персонажа, не так ли? - person Thomas Ahle; 28.11.2013
comment
@ThomasAhle Вот пример: Слово: гитара Текст: Я люблю гитары. Затем вы попытаетесь сопоставить r гитары (6-й символ) с 6-м символом текста ... e of love '... поскольку они не совпадают ... нет необходимости проверять против I love, поскольку они никогда не будут совпадать ... так что вы перепрыгиваете всю эту часть ... - person gtgaxiola; 02.12.2013
comment
Верно, а затем вы прыгаете, чтобы проверить 'r' против '', но это все равно переместило вас вперед только на 1 шаг. Если бы вы проверили «g» против «l», вы бы получили тот же результат. Нет? - person Thomas Ahle; 02.12.2013
comment
@ThomasAhle, вероятно, это поможет: utdallas.edu/~besp/demo /John2010/boyer-moore.htm И попробуйте мой пример: Текст: Я люблю гитары Шаблон: гитара - person gtgaxiola; 03.12.2013
comment
Хороший пример, демонстрирующий идею BM. К сожалению, в реализации есть ошибки. Попробуйте в качестве входных данных ЗДЕСЬ ЕСТЬ SIMPIEXAMPLE и ПРИМЕР. Это не приведет к совпадению, даже если строка поиска встречается в искомом тексте. - person Olaf Dietsche; 29.05.2015
comment
@ThomasAhle Я думаю, что идея в том, что вы можете выяснить, где символ может совпадать в подстроке. Например, если символа нет в подстроке, вы можете пропустить по длине подстроки. - person Solomon Ucko; 13.07.2020
comment
@gtgaxiola Нет, у Бойера-Мура так не бывает. Вам нужно сместить выравнивание так, чтобы найти ближайшую букву «е» влево или «р» на гитаре, и выровнять эту «е» в паттерне с «е», вызывая несоответствие в тексте (так как «е» нет. 'в гитаре вы полностью переходите к следующему символу' e 'в тексте). Посмотрите это потрясающее видео. - person Escape0707; 01.09.2020
comment
Я нашел хороший блог, в котором объясняется техника Бойера-Мура. здесь - person CITIZENDOT; 24.11.2020

Техника Бойера-Мура подбирает символы справа налево, хорошо работает на длинных узорах. knuth moris pratt подбирает символы слева направо, быстро работает с короткими шаблонами.

person Sadaf Khursheed    schedule 14.01.2014