146
правок
Изменения
Нет описания правки
{{Определение
|definition=
'''Дерево Фе́нвика (Binary indexed tree)''' - — структура данных, требующая <tex> O(n) </tex> памяти и позволяющая эффективно (за <tex> O(\log n) </tex>)
# изменять значение любого элемента в массиве;
# выполнять некоторую ассоциативную, коммутативную, обратимую операцию <tex> G </tex> на отрезке <tex> [i, j] </tex>.
Все <tex>i</tex> мы можем получить следующим образом : <tex>i_{next} = i_{prev} | (i_{prev} + 1) </tex>, Где под | понимают побитовое ИЛИ. Следующим элементом в последовательности будет элемент, у которого первый с конца ноль превратится в единицу. Можно заметить, что если к исходному элементу прибавить единицу, то необходимый ноль обратится в единицу, но при этом все следующие единицы обнулятся. Чтобы обратно их превратить в единицы, применим операцию побитового ИЛИ. Таким образом все нули в конце превратятся в единицы и мы получим нужный элемент. Для того, чтобы понять, что эта последовательность верна, достаточно посмотреть на таблицу.
{| borderstyle="1background-color:#CCC;margin:0.5px"|style="background-color:#EEE;padding:2px 30px"|<tex>\i_{prev}</tex>|style="background-color:#FFF;padding:2px 30px"|<tex>\cdots 011 \cdots 1</tex>
|-
|style="background-color:#EEE;padding:2px 30px"|<tex>i_{prev} + 1</tex>|style="background-color:#FFF;padding:2px 30px"|<tex>\cdots 100 \cdots 0</tex>
|-
|style="background-color:#EEE;padding:2px 30px"|<tex>i_{next}</tex>|style="background-color:#FFF;padding:2px 30px"|<tex>\cdots 111 \cdots 1</tex>
|}
Для доказательства леммы рассмотрим битовую запись следующих чисел: <tex> k - 2^{h(k)} + 1 \leq i \leq k </tex>
{| borderstyle="1background-color:#CCC;margin:0.5px"|style="background-color:#EEE;padding:2px 30px"|<tex>k - 2^{h(k)} + 1</tex>|style="background-color:#FFF;padding:2px 30px"|<tex>\cdots (0 \cdots 0)</tex>
|-
|style="background-color:#EEE;padding:2px 30px"|<tex>i</tex>|style="background-color:#FFF;padding:2px 30px"|<tex>\cdots (\cdots \cdots)</tex>
|-
|style="background-color:#EEE;padding:2px 30px"|<tex>k</tex>|style="background-color:#FFF;padding:2px 30px"|<tex>\cdots (1 \cdots 1)</tex>
|}
=== Реализация ===