Binary Indexed Tree (Fenwick Tree)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Binary Indexed Tree (Fenwick Tree)相关的知识,希望对你有一定的参考价值。
??????????????? ?????? color nbsp should for date ?????? dex
Binary Indexed Tree ???????????????O(N)????????????????????????O(lgN). ???????????????????????????????????????????????????????????????????????????1??????0?????????:
???????????????????????????i?????????i????????????1???????????????1???????????????????????????????????????????????????1?????????????????????1?????????????????????????????????:
8??????????????????100
?????????1?????????????????????1?????????????????????100????????????????????????8.
??????1??????????????????0?????????1?????????1?????????sum[8]??????????????????1??????????????????8???????????????.
?????????11?????????????????????1011
?????????1??????????????????????????????1???
??????1?????????????????????1010???????????????????????????11??????????????????sum[11]??????????????????????????????11????????????
???i????????????1(LSB)??????????????????????????????
i & (-i)
???1..i????????????11??????
sum[11] = sum[8] + sum[10] + sum[11] ?????? 0..8?????? + 9, 10?????? + 11??????????????????????????????????????????
int sum = 0; while (i > 0) sum += A[i], i -= LSB(i); return sum;
??????i??????????????????????????????????????????,???sum[i]?????????????????????i?????????
while (i < SIZE) A[i] += k, i += LSB(i);
????????????5???????????????5?????????2?????????101,
??????????????????????????????5?????????
?????????5?????????2?????????????????????:5,6???????????????????????? 5 + LSB(5) = 6 ????????????
???????????????5???????????????????????????1..8?????????: 6 + LSB(6) = 8????????????????????????5..8?????????????????????4??????????????????????????????????????????????????????????????????????????????????????????sum 5..8 = sum[8] – sum[4]???
??????????????????Wiki
????????????????????????i..j???????????????sum[j] – sum[i]?????????
???LeetCode 307. Range Sum Query – Mutable???????????????????????????
class NumArray{ public: // Binary Index Tree (Fenwick Tree) NumArray(vector<int> nums) { _nums = vector<int>(nums.size(), 0); sums = vector<int>(nums.size() + 1, 0); len = sums.size(); for(int i = 0; i < len - 1; i++){ update(i, nums[i]); } } void update(int i, int val) { int d = val - _nums[i]; _nums[i++] = val; while(i < len){ sums[i] += d; i += LBS(i); } } // [i+1, j+1] inclusive, so it should be sum[j+1] - sum[i] int sumRange(int i, int j) { return sumRange(++j) - sumRange(i); } private: vector<int> sums; vector<int> _nums; int len; inline int LBS(int &i){ return i & (-i); } inline int sumRange(int i){ int sum = 0; while(i){ sum += sums[i]; i -= LBS(i); } return sum; } };
以上是关于Binary Indexed Tree (Fenwick Tree)的主要内容,如果未能解决你的问题,请参考以下文章
Fenwick Tree / Binary Indexed Tree (树状数组)的学习
高级数据结构之Fenwick Tree(Binary Indexed Tree)