Алгоритм поиска подстроки в строке с помощью суффиксного массива — различия между версиями
Строка 1: | Строка 1: | ||
− | Пусть у нас есть образец <tex> P </tex>, строка <tex> S </tex> и [[Суффиксный массив|суффиксный массив]] <tex> sufArray </tex>. Мы хотим найти все вхождения данного образца в данную строку. | + | Пусть у нас есть образец <tex> P </tex>, строка <tex> S </tex> и [[Суффиксный массив|суффиксный массив]] <tex> sufArray </tex>. Мы хотим найти все вхождения данного образца в данную строку. Существует несколько методов решения данной задачи. |
+ | |||
+ | ==Решение при помощи бинарного поиска== | ||
+ | |||
+ | Понятно, что если образец <tex> P </tex> входит в строку <tex> S </tex>, то он является префиксом какого-нибудь ее суффикса. Если вхождений несколько, то в суффиксном массиве <tex> sufArray </tex> они будут находиться рядом друг с другом. Получается, что задача сводится к бинарному поиску в упорядоченном массиве. <br> | ||
+ | |||
+ | Пусть <tex> length </tex> - длина строки <tex> S </tex>. Тогда на первом шаге сравниваем суффикс <tex> sufArray[length / 2] </tex> и образец <tex> P </tex> по первому символу. Если первый элемент суффикса лексикографически больше, то необходимо идти в левую половину <tex> sufArray </tex>, иначе в правую. На следующем шаге аналогично проверяем суффикс по середине от половины суффискного массива, затем от четверти и так далее. В результате проделанной работы получим левую и правую границы <tex> L </tex> и <tex> R </tex> соответственно, в которых необходимо вести поиск. |
Версия 05:06, 1 мая 2011
Пусть у нас есть образец суффиксный массив . Мы хотим найти все вхождения данного образца в данную строку. Существует несколько методов решения данной задачи.
, строка иРешение при помощи бинарного поиска
Понятно, что если образец
Пусть
- длина строки . Тогда на первом шаге сравниваем суффикс и образец по первому символу. Если первый элемент суффикса лексикографически больше, то необходимо идти в левую половину , иначе в правую. На следующем шаге аналогично проверяем суффикс по середине от половины суффискного массива, затем от четверти и так далее. В результате проделанной работы получим левую и правую границы и соответственно, в которых необходимо вести поиск.