树状数组详解


 这里先看一下大神的解释,我的主要任务是对于你们有点迷糊的地方再次解释一下,当然你是大牛请绕行  ,树状数组: 大神博客


1、c[k]是有几个a[i]数组相加起来的和,其实你会发现(图1),每一个c[k]必然等于a[k]和其他几个a数组相加的和,那么我们怎么确定是多少个呢?那就要用到lowbit(k),其实它的值

就代表着有多少个从a[k]+..a[i],就拿他给的例子说吧;c[0110]=a[0110]+a[0101],lowbit(0110)=0010,0010的值就是2,代表有c[0110]有2个a数组相加得到的,当然开始的第一

个肯定是a[0110]下一个就是a[0101],转换成十进制c[6]=a[6]+a[5].


2、我们如果更改a数组的值,那c数组相应的值就要发生一些变化,从图中肯定我们一眼就能看出来,那没有图我们如何知道改变c数组的哪些值呢?这时候就给了我们一个运算法

则,k+=lowbit(k),每次运算的k值就代表着c数组需要改变的值,其实这个运算就相当于我们改变了底层的值,然后去找和它相关的值,然后去改变它,就像作者说的更新c数组的

值,具体实现一定要仔细研究后面的代码,估计看了我的解释,代码看懂应该不是问题,不知道你会不会问到哪个地方才算停止呢?我就再问这个问题,其实很简单,c数组中肯定

会有最大的下表,找到最大的下表,不就结束了嘛,(自己太菜).

 

3、虽然作者没有在对这个进行解释,我感觉还是有必要说下的,代码可能你们都有点晕,1~k的区间和,他的代码就相当于,求出1-k a数组的和,用c数组进行表示,举个例子

吧,比如说1-6的和,首先它会找到c[6],然后根据运算会找到c[4],然后就很简单的求出了1-6数组a的和,什么时候才会结束呢,那就是运算的k=0,就会跳出循环。


你可能感兴趣的:(树状数组)