树状数组的应用及拓展
Posted cwjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组的应用及拓展相关的知识,希望对你有一定的参考价值。
众所周知,树状数组是一个常用的数据结构。。。
1.为啥用树状数组:
如果用普通的前缀数组来维护前缀的信息,即使查询时o(1)的,但是修改就几乎要o(n),效率有时十分低下.
而树状数组却弥补了这一缺点,修改和查询都是o(logn)的
2.如何构建树状数组:
根据二次幂的性质,我们可以把一个数转化成一个独一无二的二进制数,所以,我们可以建立一个类似于二进制数的数组来维护前缀和
假如一个整数 x可以别分为x=2^i1+2^i2+2^i3...+2^im那么就可以把一个区间[1...x]分为(logx)的几个小区间
假设i1>i2>i3>...im
1长度为2^i1区间[1,2^i1]
2长度为2^i2区间[2^i1+1,2^i1+2^i2]
3长度为2^i3区间[2^i2+2^i1+1,2^i1+2^i2+2^i3]
...
这些小区间的特点是长度为二进制分解下最小的二次幂,也就是lowbit(x);
例如11=8+2+1=2^3+2^1+2^0,那么区间11可以分为[1,8],[9,10],[11],长度分别为lowbit(8)=8,lowbit(10)=2,lowbit(11)=1
- C[1] = A[1];
- C[2] = A[1] + A[2];
- C[3] = A[3];
- C[4] = A[1] + A[2] + A[3] + A[4];
- C[5] = A[5];
- C[6] = A[5] + A[6];
- C[7] = A[7];
- C[8] = A[1] + A[2] + A[3] + A[4] + A[5] + A[6] + A[7] + A[8];
以上是关于树状数组的应用及拓展的主要内容,如果未能解决你的问题,请参考以下文章