树状数组详解
2016-11-06 21:09
127 查看
这里先看一下大神的解释,我的主要任务是对于你们有点迷糊的地方再次解释一下,当然你是大牛请绕行 ,树状数组: 大神博客
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,就会跳出循环。
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,就会跳出循环。
相关文章推荐
- C语言树状数组的实例详解
- POJ 1195 树状数组详解
- 详解树状数组三种模型
- 树状数组的改段求段详解
- 【面试常见算法整理】Binary Indexed Tree(Fenwick Tree,树状数组)详解
- 树状数组 详解
- 【详解】树状数组
- 【模板】树状数组(详解)
- Java中文问题详解
- Windows下Ping命令详解及使用小技巧
- JavaScript封装的常用工具类库bee.js用法详解【经典类库】
- 基于Java字符编码的使用详解
- Java使用AES加密和解密的实例详解
- 将15位身份证补全为18位身份证的算法示例详解
- C#重点知识详解(一)
- C#重点知识详解(二)
- C#重点知识详解(三)
- 面试问答详解(三)
- C#重点知识详解(五 代理:一)