樹狀數組(fenwick tree)
阿新 • • 發佈:2018-07-31
結構 使用數組 ini std con bit 表現 概念 實現
樹狀數組又成芬威克樹,概念上是樹狀,實際上是使用數組實現的,表現為一種隱式數據結構,balabala...詳情請見:https://en.wikipedia.org/wiki/Fenwick_tree
其中`i += (i & -i)`的相當於求 $ 2^{n-1} , n \in 1,2,3... $,還可以寫成`i += (i & (i ^ (i - 1)))`。
code:
#include <iostream> #define LSB(i) (i & -i) const int M = 10001; int bit_tree[M]; int freq[M]; int getsum(int index) { int sum = 0; for (index += 1; index > 0; index -= LSB(index)) sum += bit_tree[index]; return sum; } void update(int n, int index, int val) { for (index += 1; index <= n; index += LSB(index)) bit_tree[index] += val; } void init(int freq[], int n) { for (int i = 1; i <= n; i++) bit_tree[i] = 0; for (int i = 0; i < n; i++) update(n, i, freq[i]); } int main() { int n; std::cin >> n; for (int i = 0; i < n; i++) std::cin >> freq[i]; init(freq, n); for (int i = 0; i < n; i++) std::cout << getsum(i) << std::endl; for (int i = 1; i <= n; i++) std::cout << bit_tree[i] << ‘ ‘; return 0; }
一個例子:
樹狀數組(fenwick tree)