树状数组----构建与基本操作

来源:互联网 发布:酒店清洗床单 知乎 编辑:程序博客网 时间:2024/05/23 01:17

树状数组

树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值。// 借来了百度上的定义

lowbit

int lowbit(int n) {    return n&(-n);}// ‘&’为按位取反 //  lowbit可取得n二进制下最后一位‘1’代表的数字大小

示意图

![图1](http://img.blog.csdn.net/20160709231925075)![图2](http://img.blog.csdn.net/20160709231948150)

性质

如示意图,树状数组的每一层的lowbit值相等,且lowbit值越大,越接近根。对于节点i,如果他是左子节点,那么他的父节点的编号为i+lowbit(i);如果他是右子节点,那么他的父节点的编号是i-lowbit(i);如图一每一个C[i]所代表的空间是白条的所覆盖的所有A[n];

构建

树状数组的构建

    for(int i = 1; i <= n; i++)        cin >> A[i];    for(int i = 1; i <= n; i++)        for(int j = i-lowbit(i); j <= i; j++)            C[i] += A[j];    // A[i]用于储存原始变量    // C[i]为树状数组

基本操作—add

void add_num(int x, int d) {    while (x <= n) {        C[x] += d;        x += lowbit(x);    }}//顺着节点C[x]开始往左走,边走边“往上爬”(无需沿着树的边),将经过的所有的C[i]的值相加

基本操作—sum

void add_num(int x, int d) {    while (x <= n) {        C[x] += d;        x += lowbit(x);    }}//顺着C[x]开始往右走,边走边“往上爬”(无需沿着树的边),将经过的所有的C[i]点的数据进行修改
0 0