您的位置:首页 > 其它

树状数组(BIT)

2017-06-28 18:04 148 查看
树状数组(BIT)是能够完成下述操作的数据结构。

给定一个初始值全为0的数列a1,a2,a3,....,an

1.给定i,计算a1+a2+....+ai

2.给定i和x,执行ai+=x

BIT的求和:

计算前i项的和需要从i开始,不断把当前位置i的值加到结果中,并从i中减去i的二进制最低非0位对应的幂,直到i变成0为止。i的二进制的最后一个1可以通过i&-i得到。

int bit[MAX_N+1],n;

int sum(int i)

{

    int s=0;

    while(i>0)

    {

        s+=bit[i];

        i-=i&-i;

    }

    return s;

}

BIT的值的更新:

使第i项的值增加x需要从i开始,不断把当前位置i的值增加x,并把i的二进制最低非0位对应的幂加到i上。

void add(int i,int x)

{

    while(i<=n)

    {

        bit[i]+=x;

        i+=i&-i;

    }

}

复杂度O(logn)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树状数组