Изменения

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

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

297 байт добавлено, 13:31, 21 марта 2016
Алгоритм
Данный алгоритм основывается на методе решения задачи <tex>\mathrm{RMQ}</tex> с помощью [[Решение RMQ с помощью разреженной таблицы|разреженной таблицы]] за <tex>\langle O(N \log N),O(1) \rangle</tex>.
Чтобы избавиться от логарифма используется предподсчёт ответа для небольших подстрок входной последовательности. Разделим последовательность <tex>A_i</tex> на блоки длины <tex>K=\dfrac{1}{2}\log_2 N</tex>. Для каждого блока вычислим минимум на нём и определим <tex>B_i</tex> как позицию минимального элемента в <tex>i</tex>-ом блоке.
На новой последовательности <tex>B_i</tex> построим [[Решение RMQ с помощью разреженной таблицы|разреженную таблицу]]. При этом размер разреженной таблицы и время её построения будут равны: <tex>\frac{N}{K}</tex><tex> log \frac{N}{K}=(\frac{2N}{log N}) log(\frac{2N}{log N})=(\frac{2N}{log N}) (1 + log (\frac{N}{log N})) \leqslant \frac{2N}{log N} + 2N = O (N)</tex> Теперь для ответа на запрос <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>;
}}
Осталось создать <tex>O(\sqrt N)</tex> таблиц {{---}} по одной для каждого типа блока. В такую таблицу необходимо занести предподсчитанные ответы на все возможные запросы минимума внутри блока соответствующего типа, которых <tex>\bigg(\dfrac{1}{2}\log_2 N\bigg)^2 = O(\log^2 N)</tex>. Для каждого блока в <tex>B_i</tex> необходимо заранее вычислить его тип. Таким образом мы получили возможность отвечать на запрос минимума по любой части блока за <tex>O(1)</tex>, затратив на предподсчёт <tex>O(\sqrt N \log^2 N)</tex> времени.
=== Псевдокод ===
Анонимный участник

Навигация