本期节目中我们介绍了Fenwick Tree/Binary Indexed Tree/树状数组的原理和实现以及它在leetcode中的应用。
In this episode, we will introduce Fenwick Tree/Binary Indexed Tree, its idea and implementation and show its applications in leetcode.
Fenwick Tree is mainly designed for solving the single point update range sum problems. e.g. what’s the sum between i-th and j-th element while the values of the elements are mutable.
Init the tree (include building all prefix sums) takes O(nlogn)
Update the value of an element takes O(logn)
Query the range sum takes O(logn)
Space complexity: O(n)
Applications:
Implementation:
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class FenwickTree { public: FenwickTree(int n): sums_(n + 1, 0) {} void update(int i, int delta) { while (i < sums_.size()) { 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_; }; |
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class FenwickTree { int sums_[]; public FenwickTree(int n) { sums_ = new int[n + 1]; } public void update(int i, int delta) { while (i < sums_.length) { sums_[i] += delta; i += i & -i; } } public int query(int i) { int sum = 0; while (i > 0) { sum += sums_[i]; i -= i & -i; } return sum; } } |
Python3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class FenwickTree: def __init__(self, n): self._sums = [0 for _ in range(n + 1)] def update(self, i, delta): while i < len(self._sums): self._sums[i] += delta i += i & -i def query(self, i): s = 0 while i > 0: s += self._sums[i] i -= i & -i return s |