Изменения

Перейти к: навигация, поиск
Более быстрый поиск
Существует более быстрый алгоритм поиска образца в строке. Для этого используется <tex> lcp </tex> (longest common prefix).
Пусть :# <tex> L_p </tex> и <tex> R_p </tex> - левая и правая границы диапазона ответов в суффиксном массиве <tex> array </tex>. У любого суффикса в пределах этого диапазона есть префикс, который полностью совпадает с образцом.
Пусть <tex> L </tex> - левая граница У любого суффикса в пределах этого диапазона поиска (изначально равна 0)есть префикс, <tex> R </tex> - правая граница диапазона поиска (изначально равна <tex> |S| - 1 </tex>), а <tex> M = (L + R) / 2 </tex>который полностью совпадает с образцом.
Пусть # <tex> l = lcp(array[L], p) </tex>, а <tex> r = lcp- левая граница диапазона поиска (array[R], pизначально равна 0) </tex>. В самом начале просто посчитаем # <tex> l R </tex> и - правая граница диапазона поиска (изначально равна <tex> r |S| - 1 </tex> за линейное время, а во время выполнения алгоритма прямой пересчет производиться не будет, изменения будут происходить за ).# <tex> OM = (1L + R) / 2 </tex>.
Пусть # <tex> l = lcp(array[L], p) </tex>.# <tex> r = lcp(array[R], p) </tex>.  В самом начале просто посчитаем <tex> l </tex> и <tex> r </tex> за линейное время, а во время выполнения алгоритма прямой пересчет производиться не будет, изменения будут происходить за <tex> O(1) </tex>. # <tex> m_l = lcp(array[L], array[M]) </tex>, а .# <tex> m_r = lcp(array[M],array[R]) </tex>.  Подсчет <tex> m_l </tex> и <tex> m_r </tex> можно производить за <tex> O(1) </tex>, если применять [[Алгоритм Фарака-Колтона и Бендера|алгоритм Фарака-Колтона и Бендера]]. Любая пара суффиксов <tex> array </tex> из диапазона <tex> [L, M] </tex> имеет хотя бы <tex> m_l </tex> совпадений в префиксах. Аналогично любая пара суффиксов <tex> array </tex> из диапазона <tex> [M, R] </tex> имеет хотя бы <tex> m_r </tex> совпадений в префиксах.
Рассмотрим поиск левой границы диапазона ответов <tex> L_p </tex>.
Анонимный участник

Навигация