Fenwick Tree,Binary Indexed Tree
树状数组,又叫二元索引树,或者,Fenwick树,是Fenwick发明的一种数据结构。这种数据结构通常用来计算数组的前缀和,区间和。
这种数据结构更新节点的时间复杂度是 $\mathcal{O}(log_n)$,计算任意前缀和的时间复杂度也是 $\mathcal{O}(log_n)$,空间复杂度依旧为$\mathcal{O}(n)$。
详细的介绍,原理,过程等,可以看一看花花的这个视频。
一种 c++ 实现如下。
class FenWickTree {
public:
FenWickTree(int n): sums_(n + 1) {};
void update(int i, int delta) {
const int n = sums_.size();
while (i < n) {
sums_[i] += delta;
i += lowbit(i);
}
}
int query(int i) const {
int sum = 0;
while (i > 0) {
sum += sums_[i];
i -= lowbit(i);
}
return sum;
}
private:
static inline int lowbit(int x) { return x & (-x); }
vector<int> sums_;
};