您的位置:首页 > 其它

训练日记-13

2017-08-17 21:53 225 查看
       这几天主要在看树状数组的相关学习资料了,树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询)。

       树状数组的基本模版如下:

lowbite操作:

int lowbit(int x)

{

   //return x^(x&(x - 1));

    return x&(-x);

}

modify操作单点的更新:

void modify(int pos,int sc)//位置pos更新sc

{

    while (pos <= n)//由C[N1]到C[Nm]的过程

    {

        c[pos] += sc;

        pos += lowbit(pos);

    }

}

getsum操作区间求和:

int getsum(int pos)

{

    int sum = 0;

    while (pos > 0)//由C[Nm]到C[N1]的过程

    {

        sum += c[pos];

        pos -= lowbit(pos);

    }

    return sum;



       树状数组有自身的优越性也有自身的局限性。

      其优越性表现为:

      1).空间耗费小

      2).编程简单

      只要开一个数组,所有的操作都可以在十行代码之内实现。没有了繁琐的指针和乱七八糟的二分,编写不容易出错。

      其局限性表现为:

      1).无法记录一些附加信息(如:不相交区间的个数)

      2).树状数组的应用范围狭窄

      ①求和问题可用

      ②如果求最大值操作,而且没有删除操作的话

       明天再结合题目进一步掌握树状数组这个算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: