Обсуждение участника:Shovkoplyas Grigory — различия между версиями
(Новая страница: «'''Алгоритм Фарака-Колтона, Бендера (алгоритм Фарах-Колтона, Бендера)''' — применяется для ...») |
|||
| Строка 1: | Строка 1: | ||
'''Алгоритм Фарака-Колтона, Бендера (алгоритм Фарах-Колтона, Бендера)''' — применяется для решения за <tex>\langle O(N),O(1) \rangle</tex> времени специального случая задачи RMQ (поиск минимума на отрезке), в котором соседние элементы входной последовательности различаются на ±1. Может быть использован также для [[Сведение задачи LCA к задаче RMQ|решения задачи LCA]]. | '''Алгоритм Фарака-Колтона, Бендера (алгоритм Фарах-Колтона, Бендера)''' — применяется для решения за <tex>\langle O(N),O(1) \rangle</tex> времени специального случая задачи RMQ (поиск минимума на отрезке), в котором соседние элементы входной последовательности различаются на ±1. Может быть использован также для [[Сведение задачи LCA к задаче RMQ|решения задачи LCA]]. | ||
| − | + | {{Задача | |
| − | + | |definition = Дан массив <tex>A[1 \ldots N]</tex> целых чисел, соседние элементы которой отличаются на ±1. Поступают онлайн запросы вида <tex>(l, r)</tex>, для каждого из которых требуется найти минимум среди элементов <tex>A[l], A[l + 1], \ldots, A[r] </tex>. | |
| + | }} | ||
== Алгоритм == | == Алгоритм == | ||
| − | |||
Данный алгоритм основывается на методе решения задачи RMQ с помощью [[Решение RMQ с помощью разреженной таблицы|разреженной таблицы (sparse table, ST)]] за <tex>\langle O(N \log N),O(1) \rangle</tex>. | Данный алгоритм основывается на методе решения задачи RMQ с помощью [[Решение RMQ с помощью разреженной таблицы|разреженной таблицы (sparse table, ST)]] за <tex>\langle O(N \log N),O(1) \rangle</tex>. | ||
| Строка 16: | Строка 16: | ||
# минимум от начала блока, содержащего <tex>j</tex>, до <tex>j</tex>. | # минимум от начала блока, содержащего <tex>j</tex>, до <tex>j</tex>. | ||
Ответом на запрос будет позиция меньшего из эти трёх элементов. | Ответом на запрос будет позиция меньшего из эти трёх элементов. | ||
| + | |||
| + | [[Файл:F-C_B_algo.png|500px|center|Части, из которых состоит ответ на запрос RMQ]] | ||
Второй элемент мы уже умеем находить за <tex>O(1)</tex> с помощью <tex>b_i</tex> и ST. Осталось научиться находить минимум по отрезку, границы которого не совпадают с границами блоков. | Второй элемент мы уже умеем находить за <tex>O(1)</tex> с помощью <tex>b_i</tex> и ST. Осталось научиться находить минимум по отрезку, границы которого не совпадают с границами блоков. | ||
Версия 14:56, 16 июня 2015
Алгоритм Фарака-Колтона, Бендера (алгоритм Фарах-Колтона, Бендера) — применяется для решения за времени специального случая задачи RMQ (поиск минимума на отрезке), в котором соседние элементы входной последовательности различаются на ±1. Может быть использован также для решения задачи LCA.
| Задача: |
| Дан массив целых чисел, соседние элементы которой отличаются на ±1. Поступают онлайн запросы вида , для каждого из которых требуется найти минимум среди элементов . |
Алгоритм
Данный алгоритм основывается на методе решения задачи RMQ с помощью разреженной таблицы (sparse table, ST) за .
Чтобы избавиться от логарифма используется предподсчёт ответа для небольших подстрок входной последовательности. Разделим последовательность на блоки длины . Для каждого блока вычислим минимум на нём и определим как позицию минимального элемента в -том блоке.
На новой последовательности построим разреженную таблицу. Теперь для ответа на запрос RMQ, если и находятся в разных блоках, нам необходимо вычислить следующее:
- минимум на отрезке от до конца содержащего блока;
- минимум по всем блокам, находящимся между блоками, содержащими и ;
- минимум от начала блока, содержащего , до .
Ответом на запрос будет позиция меньшего из эти трёх элементов.
Второй элемент мы уже умеем находить за с помощью и ST. Осталось научиться находить минимум по отрезку, границы которого не совпадают с границами блоков.
Минимум внутри блока
| Утверждение: |
Если две последовательности и таковы, что все их элементы на соответствующих позициях различаются на одну и ту же константу (т.е. ), то любой запрос RMQ даст один и тот же ответ для обеих последовательностей. |
Таким образом, мы можем нормализовать блок, вычтя из всех его элементов первый. Тем самым мы значительно уменьшим число возможных типов блоков.
| Утверждение: |
Существует различных типов нормализованных блоков. |
| Соседние элементы в блоках отличаются на ±1. Первый элемент в нормализованном блоке всегда равен нулю. Таким образом, каждый нормализованный блок может быть представлен ±1-вектором длины . Таких векторов . |
Осталось создать таблиц — по одной для каждого типа блока. В такую таблицу необходимо занести предподсчитанные ответы на все возможные запросы минимума внутри блока соответствующего типа, коих . Для каждого блока в необходимо заранее вычислить его тип. Таким образом мы получили возможность отвечать на запрос минимума по любой части блока за , затратив на предподсчёт времени.
Результат
Итого, на предподсчёт требуется времени и памяти, а ответ на запрос вычисляется за .
См. также
- Решение RMQ с помощью разреженной таблицы
- Сведение задачи RMQ к задаче LCA
- Сведение задачи LCA к задаче RMQ
Источники
- Bender, M.A., Farach-Colton, M. — The LCA Problem Revisited. — LATIN (2000), с. 88-94