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)

树状数组(Binary Indexed Tree)

树状数组(Binary Indexed Tree)

树状树组(Binary Indexed Tree (BIT))的C++部分实现

树状数组(Binary Indexed Tree)