Алгоритм Карпа-Рабина - PullRequest
       50

Алгоритм Карпа-Рабина

0 голосов
/ 31 октября 2018

Изображение ниже: 6.006-Введение в алгоритмы ,

enter image description here

Выполняя курс 6.006 - Введение в алгоритмы, предоставленный MIT OCW, я наткнулся на алгоритм Рабина-Карпа.

Может кто-нибудь помочь мне понять, почему требуется первый rs () == rt ()? Если он используется, то не должны ли мы сначала проверить грубой силой, равны ли струны, а затем двигаться вперед? Почему мы не учитываем равенство строк, когда хеширование выполняется из t [0], а затем пытаемся найти другие совпадения строк?

На изображении rs () для хэш-значения, а rs.skip [arg] должен удалить первый символ этой строки, предполагая, что это «arg»

1 Ответ

0 голосов
/ 03 ноября 2018

Может кто-нибудь помочь мне понять, почему требуется первый rs()==rt()?

Полагаю, вы имеете в виду тот, который находится перед петлей диапазона. Если строки имеют одинаковую длину, то цикл диапазона не будет выполняться (пустой диапазон). Чек необходим для покрытия этого случая.

Если он используется, то разве мы не должны сначала проверить грубой силой, равны ли струны, а затем двигаться вперед?

Не уверен, что вы имеете в виду здесь. Размещенный код остается пустым (с ...) после того, как найдены соответствующие хэши. Давайте не будем забывать, что в этот момент мы должны сравнить строки, чтобы подтвердить, что мы действительно нашли соответствие. И до реализации (не показано) продолжать поиск до конца или нет.

Почему мы не рассматриваем равенство строк, когда хеширование выполняется из t [0], а затем пытаемся найти другие совпадения строк?

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

...