Статистики на отрезках. Корневая эвристика — различия между версиями
Dimitrova (обсуждение | вклад) (→Описание) |
Dimitrova (обсуждение | вклад) (→Описание) |
||
Строка 13: | Строка 13: | ||
Для того чтобы посчитать сумму в отрезке <tex>[l \ldots r]</tex>, надо просуммировать элементы только в двух "хвостах": <tex>[l \ldots (k+1)len-1]</tex> и <tex>[(p+1)len \ldots r]</tex>, и просуммировать значения <tex>b_i</tex> во всех блоках, начиная с k и заканчивая p: | Для того чтобы посчитать сумму в отрезке <tex>[l \ldots r]</tex>, надо просуммировать элементы только в двух "хвостах": <tex>[l \ldots (k+1)len-1]</tex> и <tex>[(p+1)len \ldots r]</tex>, и просуммировать значения <tex>b_i</tex> во всех блоках, начиная с k и заканчивая p: | ||
<tex>\sum_{i = l}^r a_i = \sum_{i = l}^{(k + 1)len - 1} + a_i \sum_{i = k}^p b_i + \sum_{i = p + 1}^r a_i</tex> | <tex>\sum_{i = l}^r a_i = \sum_{i = l}^{(k + 1)len - 1} + a_i \sum_{i = k}^p b_i + \sum_{i = p + 1}^r a_i</tex> | ||
+ | |||
+ | Теперь разрешим изменять элементы. Если меняется какой-то элемент <tex>a_i</tex>, то достаточно обновить значение <tex>b_k</tex> в том блоке, в котором этот элемент находится: | ||
+ | |||
+ | <tex>b_k\ += a_i - old\_a_i\_val</tex> | ||
+ | |||
+ | <tex>(k = i / len)</tex> | ||
==Оценка сложности== | ==Оценка сложности== |
Версия 20:20, 3 мая 2011
Содержание
Определение
Корневая эвристика (Sqrt-декомпозиция) — это метод, или структура данных, которая позволяет выполнять некоторые типичные операции (суммирование элементов подмассива, нахождение минимума/максимума и т.д.) за
.Описание
Привидем описание для операции суммирования
Дан массив
. Cделаем следующий предпосчёт: разделим массив A на блоки длины (округлённому к целому), и в каждом блоке заранее предпосчитаем нужную операцию в нём. Пусть len — это длина блока , а — количество блоков:Через
мы обозначили результат предпосчёта в k-ом подотрезке.Для того чтобы посчитать сумму в отрезке
, надо просуммировать элементы только в двух "хвостах": и , и просуммировать значения во всех блоках, начиная с k и заканчивая p:Теперь разрешим изменять элементы. Если меняется какой-то элемент
, то достаточно обновить значение в том блоке, в котором этот элемент находится:
Оценка сложности
Размер каждого из "хвостов", очевидно, не превосходит длины блока
, а количество блоков не превосходит . Поскольку и , и мы выбирали , то всего для вычисления суммы в отрезке нам понадобится операций.