Изменения

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

Статистики на отрезках. Корневая эвристика

1128 байт добавлено, 19:12, 15 мая 2012
Нет описания правки
'''Корневая эвристика (Sqrt-декомпозиция)''' — это метод, или структура данных, которая позволяет выполнять некоторые ассоциативные операции над отрезками (суммирование элементов подмассива, нахождение минимума/максимума и т.д.) за <tex> O(\sqrt n)</tex>. }}
== Описание ===== Предпосчет ===
[[Файл:sqrt.png|right|540px]]
Пусть нам дан массив <tex>A</tex> размерности <tex>n</tex>. Cделаем следующий предпосчет:
</pre>
=Пердпосчет, очевидно, происходит за <tex>O(n)</tex> времени. == Обработка запроса ===
[[Файл:sqrt(sum).png|right|520px]]
Пусть мы получили запрос на выполнение операции на отрезке <tex>[l, r]</tex>. Отрезок может охватить некоторые блоки массива <tex>B</tex> полностью, а так же не более двух блоков (начальный и конечный) - не полностью.
sum += A[i]
</pre>
 
 
Размер каждого из "хвостов", очевидно, не превосходит длины блока <tex>len</tex>, а количество блоков не превосходит <tex>cnt</tex>. Поскольку и <tex>len</tex>, и <tex>cnt</tex> мы выбирали <tex>~ ~ \approx \sqrt{n}</tex>, то для выполнения операции на отрезке <tex>[l, r]</tex> нам понадобится <tex>O(\sqrt{n})</tex> времени.
 
== Запрос на изменение элемента ==
[[Файл:sqrt(+delta).png|right|264px]]
 === Запрос на изменение элемента ===Для реализации данного запроса нам, в зависимости от того имеет ли операция, для которой мы сделали предпосчет, обратную операцию или нет.* если есть обратная операция, то нам необходимо поменять всего два элемента, т.к. так как каждый элемент входит в ровно один элемент массива <tex>B</tex>;* если нет обратной операции, то нам придется заново сделать предпосчет для данного блока и записать полученный результат в элемент массива <tex>B</tex>.
<tex>p</tex> - номер элемента из массива <tex>A</tex>, который необходимо заменить; <tex>delta</tex> - на сколько нужно изменить данный элемент.
 
Запрос на изменение элемента для суммы (есть обратная операция):
 
<pre>
A[p] += delta
</pre>
==Оценка сложности==Запрос на изменение элемента для поиска минимума (нет обратной операции): Размер каждого из "хвостов", очевидно, не превосходит длины блока <texpre>index = len<* (p /tex>, а количество блоков не превосходит <tex>cnt<)A[p] += deltafor i = index to index + len - 1 B[p /tex>. Поскольку и <tex>len] = min(A[i], A[i + 1])</texpre>  Таким образом, и запрос на изменение элемента происходит не более чем за длину блока <tex>cnt</tex> мы выбирали <tex>~ ~ \approx \sqrt{n}len</tex>, то для вычисления суммы (нахождения минимума/максимума и т.де.) на отрезке <tex>[l, r]</tex> нам понадобится не более чем за <tex>O(\sqrt{n})</tex> времени.
==Источники==
338
правок

Навигация