树状数组学习总结
2014-12-06 10:22
274 查看
树状数组最大的特点就是求解特定区间的元素的和操作时间复杂度小O(lgn),现对于传统的顺序求和的操作树状数组在求解过程中采用了二进制的思想,巧妙地化解了多次求和的重复操作,在很大程度上提高了效率。
上图是树状数组的存储于求解过程,图片给出的很详细,数组a存放的是原始的需要求和的元素,数组c存放的是利用二进制存储的各部分的和。
在控制各部分求和的过程中有这样的过程操作,
C7 = A7
C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8
……
C16 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10 + A11 + A12 + A13 + A14 + A15 + A16
所采用的计算过程是主要是二进制思想;
其中求二进制操作的过程可用下面操作完成
int lowbit(int x)
{
return x&(-x); //找出x的二进制表示的末尾有多少个0,但是我感觉这么说很不妥当的,这个操作的主要作用
//就是可以实现2^k的操作,或者说是二进制表示的做右侧的1的位置
}
其次在存储的过程中还需要一个操作来初始化数组c
void change(int i,int x)
{
while(i<=maxn)
{
c[i]+=x;
i+=lowbit(i);
}
}
再输入数组a的同时就需要对数组c进行初始化,以及进行后续的与ci相关联的c数组元素进行修改,以保证c数组中存储的一直都是最新的变更之后的值,此外对于初学者,在看这部分的时候可能会有点迷惑,所以可以尝试在每一次变更的过程中查看i的值的变化,来更好的理解其中变化的规律。
其次最终额操作就是求前i项的和的操作了,
int sum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
与上边change操作的相似度很大,只不过是 x-=lowbit(x);这个操作的目的是保证取出数组c中x之前的元素的和.
上图是树状数组的存储于求解过程,图片给出的很详细,数组a存放的是原始的需要求和的元素,数组c存放的是利用二进制存储的各部分的和。
在控制各部分求和的过程中有这样的过程操作,
C1 = A1 C2 = A1 + A2 C3 = A3 C4 = A1 + A2 + A3 + A4 C5 = A5 C6 = A5 + A6 | [align=center][/align] |
C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8
……
C16 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10 + A11 + A12 + A13 + A14 + A15 + A16
所采用的计算过程是主要是二进制思想;
其中求二进制操作的过程可用下面操作完成
int lowbit(int x)
{
return x&(-x); //找出x的二进制表示的末尾有多少个0,但是我感觉这么说很不妥当的,这个操作的主要作用
//就是可以实现2^k的操作,或者说是二进制表示的做右侧的1的位置
}
其次在存储的过程中还需要一个操作来初始化数组c
void change(int i,int x)
{
while(i<=maxn)
{
c[i]+=x;
i+=lowbit(i);
}
}
再输入数组a的同时就需要对数组c进行初始化,以及进行后续的与ci相关联的c数组元素进行修改,以保证c数组中存储的一直都是最新的变更之后的值,此外对于初学者,在看这部分的时候可能会有点迷惑,所以可以尝试在每一次变更的过程中查看i的值的变化,来更好的理解其中变化的规律。
其次最终额操作就是求前i项的和的操作了,
int sum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
与上边change操作的相似度很大,只不过是 x-=lowbit(x);这个操作的目的是保证取出数组c中x之前的元素的和.
相关文章推荐
- 树状数组学习以及题目总结
- 树状数组学习总结
- JAVA学习总结之JAVA的安全性_数组(未完待续)
- php学习收藏:PHP数组的总结
- 树状数组学习笔记
- 线段树 | 树状数组 【怒学习怒刷ing...】
- 树状数组专题总结1
- ( poj 2352,poj 3067, poj2481)树状数组题目总结(二)
- 10月25日学习总结之 C#数组和枚举
- hdu_1166,树状数组的学习
- uC/OS-II的OS_CORE.C中OSUnMapTbl[]数组学习总结
- 信息>后缀数组学习笔记--后缀数组解题方法总结
- Java学习总结之第九章 数组
- JavaScript学习总结_五.数组
- 树状数组 学习
- 树状数组学习
- 关于数组中最小两数差的学习总结
- 树状数组总结
- 树状数组总结二
- 树状数组总结