树状数组(Binary Indexed Tree)
Posted qbits
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组(Binary Indexed Tree)相关的知识,希望对你有一定的参考价值。
特点
树状数组常用于查询前缀和,前缀和通过差分可以得到区间和,并支持单点修改
单点修改和查询前缀和的时间复杂度均为\(O(n\log_2 n)\)
数据结构与基本操作
假定有\(a_1, a_2, ..., a_n\)共n个数,我们使用数组bit[n+1] = 0, 其中0位置不存储任何信息,仅作为边界判断
i最低位的2的幂
int lowbit(int i) return i & (-i);
前缀和
int sum(int i)
int r = 0;
while(i > 0)
r += bit[i];
i -= lowbit(i)
return r;
单点修改
void update(int i, int d)
while(i <= n)
bit[i] += d;
i += lowbit(i)
初始化
for(int i = 0; i < a.size(); i++)
update(i + 1, a[i]);
经典例题
模板题
307. Range Sum Query - Mutable
493. Reverse Pairs
离散化
315. Count of Smaller Numbers After Self
327. Count of Range Sum
以上是关于树状数组(Binary Indexed Tree)的主要内容,如果未能解决你的问题,请参考以下文章
Fenwick Tree / Binary Indexed Tree (树状数组)的学习
LeetCode线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)