树状数组(Binary Indexed Tree)

Posted qbits

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组(Binary Indexed Tree)相关的知识,希望对你有一定的参考价值。

特点

树状数组常用于查询前缀和,前缀和通过差分可以得到区间和,并支持单点修改
单点修改和查询前缀和的时间复杂度均为\(O(n\log_2 n)\)

数据结构与基本操作

假定有\(a_1, a_2, ..., a_n\)共n个数,我们使用数组bit[n+1] = 0, 其中0位置不存储任何信息,仅作为边界判断

i最低位的2的幂

int lowbit(int i) return i & (-i);

前缀和

int sum(int i)
    int r = 0;
    while(i > 0)
        r += bit[i];
        i -= lowbit(i)
    

    return r;

单点修改

    void update(int i, int d)
        while(i <= n)
            bit[i] += d;
            i += lowbit(i)
        
    

初始化

    for(int i = 0; i < a.size(); i++)
        update(i + 1, a[i]);

经典例题

模板题

307. Range Sum Query - Mutable
493. Reverse Pairs

离散化

315. Count of Smaller Numbers After Self
327. Count of Range Sum

以上是关于树状数组(Binary Indexed Tree)的主要内容,如果未能解决你的问题,请参考以下文章

树状数组(Binary Indexed Tree)

树状数组(Binary Indexed Tree)

树状数组(Binary Indexed Tree,BIT)

Fenwick Tree / Binary Indexed Tree (树状数组)的学习

LeetCode线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)

高级数据结构之Fenwick Tree(Binary Indexed Tree)