Изменения

Перейти к: навигация, поиск

Алгоритм Фарака-Колтона и Бендера

47 байт добавлено, 13:59, 3 марта 2016
Нет описания правки
'''Алгоритм Фарака-Колтона, Бендера''' (англ. ''Farach-Colton, Bender'') — применяется для решения за <tex>\langle O(N),O(1) \rangle</tex> времени специального случая задачи <tex>\mathrm{RMQ}</tex> (поиск минимума на отрезке), в котором соседние элементы входной последовательности различаются на <tex>±1</tex>. Может быть использован также для [[Сведение задачи LCA к задаче RMQ|решения задачи <tex>\mathrm{LCA}</tex>]].
{{Задача
== Алгоритм ==
Данный алгоритм основывается на методе решения задачи <tex>\mathrm{RMQ}</tex> с помощью [[Решение RMQ с помощью разреженной таблицы|разреженной таблицы (sparse table, ST)]] за <tex>\langle O(N \log N),O(1) \rangle</tex>.
Чтобы избавиться от логарифма используется предподсчёт ответа для небольших подстрок входной последовательности. Разделим последовательность <tex>A_i</tex> на блоки длины <tex>\dfrac{1}{2}\log_2 N</tex>. Для каждого блока вычислим минимум на нём и определим <tex>B_i</tex> как позицию минимального элемента в <tex>i</tex>-ом блоке.
На новой последовательности <tex>B_i</tex> построим [[Решение RMQ с помощью разреженной таблицы|разреженную таблицу]]. Теперь для ответа на запрос <tex>\mathrm{RMQ}</tex><tex>[l:r]</tex>, если <tex>l</tex> и <tex>r</tex> находятся в разных блоках, нам необходимо вычислить следующее:
# минимум на отрезке от <tex>l</tex> до конца блока, содержащего <tex>l</tex>;
# минимум по всем блокам, находящимся между блоками, содержащими <tex>l</tex> и <tex>r</tex>;
{{Утверждение
|id=sameblocks
|statement=Если две последовательности <tex>x_i</tex> и <tex>y_i</tex> таковы, что все их элементы на соответствующих позициях различаются на одну и ту же константу (т.е. <tex>\forall k: x_k = y_k + C</tex>), то любой запрос <tex>\mathrm{RMQ}</tex> даст один и тот же ответ для обеих последовательностей.
}}
Анонимный участник

Навигация