Изменения

Перейти к: навигация, поиск
Более быстрый поиск
=== Более быстрый поиск ===
На <tex> i </tex>-ом шаге алгоритма мы определяем диапазон, Существует более быстрый алгоритм поиска образца в котором <tex> i </tex> первых символов образца и суффиксов диапазона совпадаютстроке. На самом деле нам не обязательно на каждом шаге проверять лишь один новый символ. Воспользуемся <tex> Для этого используется lcp </tex>(longest common prefix). <br>Пусть левая и правая границы нашего диапазона на каком-то шаге - это при построении суффиксного массива для строки <tex> L s </tex> был построен еще и массив <tex> R LCP </tex> соответственно. Допустим, что мы знаем длину общего префикса образца с суффиксами, лежащими на краях текущего диапазона: <tex> l i </tex> - ой позиции которого соответствует наибольший общий префикс образца и суффикса с левого края (<tex> l = lcp(p, array[L]) </tex>), а <tex> r i </tex> - общий префикс образца ого и суффикса с правого края (<tex> r = lcp(p, array[R]i+1) </tex>). Будем поддерживать <tex> l </tex> и <tex> r </tex> после каждого уточнения границ диапазона-ого суффиксов. <br>Для каждой пары суффиксов внутри текущего диапазона их lcp не меньше, чем минимум из Пусть <tex> l L </tex> и <tex> r </tex>, то естьобщий префикс образца и любого суффикса внутри - левая граница текущего диапазона не меньше <tex> m = min(l,r) </tex>. Значит <tex> m </tex> символов можно пропускать сразу, зная, что они совпадают в любом случае, и сравнивать уже <tex> m + изначально равна 1 </tex> символ. [[Файл:pic.png|450px]] В худшем случае, конечно, ничего мы от этого не выиграем: если искомый элемент находится на краю массива, но соседи совсем не похожи по <tex> lcp </tex>, то <tex> r </tex> (или <tex> l </tex>) будет мало каждый раз, а <tex> m R </tex> будет тоже мало, что сведет оптимизацию на нет. Таким образом в наихудшем случае результат будет прежним <tex> O- правая граница текущего диапазона (|p|log|s|изначально равна длине строки) </tex>, но в среднем <tex> O(|p| + log|s|) </tex>.
==Литература==
* http://habrahabr.ru/blogs/algorithm/115346/
Анонимный участник

Навигация