Я пытаюсь разобраться в алгоритме Bitap , но у меня возникают проблемы с пониманием причин, лежащих в основе шагов алгоритма.
Я понимаю основную предпосылку алгоритма, а именно (поправьте меня, если я ошибаюсь):
Two strings: PATTERN (the desired string)
TEXT (the String to be perused for the presence of PATTERN)
Two indices: i (currently processing index in PATTERN), 1 <= i < PATTERN.SIZE
j (arbitrary index in TEXT)
Match state S(x): S(PATTERN(i)) = S(PATTERN(i-1)) && PATTERN[i] == TEXT[j], S(0) = 1
В английских терминах PATTERN.substring(0,i)
соответствует подстроке TEXT, если предыдущая подстрока PATTERN.substring(0, i-1)
была успешно сопоставлена и символ в PATTERN[i]
совпадает с символом в TEXT[j]
.
Чего я не понимаю, так это реализации сдвига бита -. Официальный документ, подробно описывающий этот алгоритм, в основном излагает его , но я не могу представить себе, что должно происходить. Спецификация алгоритма — это только первые 2 страницы статьи , но я выделю важные части:
Вот битовая -сдвигающая версия концепции:
Вот T[text] для примера строки поиска:
А вот и след алгоритма.
В частности, я не понимаю, что означает таблица T, и причину OR
добавления в нее записи с текущим состоянием.
Буду признателен, если кто-нибудь поможет мне понять, что именно происходит