Дерево Фенвика (Binary Indexed Tree)
Коротко: Дерево Фенвика хранит массив чисел так, что и изменение значения, и префиксные суммы выполняются за O(log n).
Подробнее: Это особенно компактная альтернатива дереву отрезков, когда нужны только суммы (или похожие обратимые операции). Дерево живёт в простом массиве, а вычисление индексов использует младший установленный бит.
Подробности
- Идея: Позиция
iхранит сумму отрезка, длина которого равна наибольшей степени двойки, делящейi. - Запрос: Префиксная сумма до
i: прибавить значение, затемi -= i & -i, покаiне станет 0. - Изменение: Изменить значение на
d: прибавить вi, затемi += i & -i, покаiне превысит размер. - Сумма на отрезке:
сумма(r) - сумма(l-1). - Построение: Возможно за O(n), память — всего n чисел.
- Ограничения: Не каждая операция обратима. Минимум на отрезке поэтому обычно требует дерева отрезков.
См. также: O-нотация