线性数组是元素的排列,而树状数组是空间的排列。为什么是空间的排列呢?
如图,这是一个树状数组,我们把它定义为原始空间,树的每层定义为一个子空间,这些子空间镶嵌在原始空间上,我们再定义每层的首个节点为空间信息点。我们就拿第四个子空间为例,它的内部结构(除去空间信息点)(这里省略了1个前缀1)如图:
把这个原始空间的子空间定义为二重空间,我们接着把二重空间的第二个子空间展开,如图:
按照前面的说法这就是三重空间了,不难发现,在原始空间中元素含1的个数代表了该元素是第几重空间的空间信息点。
然后,我们探讨一下树状数组信息传递的机制,比如:
1.对某个节点的修改,信息会不断向上一重空间传递(由对应的后一个空间信息点接受后再传递),到达原始空间之后信息会不断向原始空间的下一个空间信息点传递。 代码的实现
for(int i = 节点; i <= 自定义终点;i += i & (-i)) {信息更新}
2.对某段区间的统计,节点会不断向上一重空间进行采集信息(由对应的前一个空间系信息点给予反馈),到达原始空间之后就会终止,这样就保证了对前面每一个节点的信息只采集过一次(提示:信息更新是的路径是向后无限延伸的,而信息采集的路径是向前有限延伸的,所以一定有唯一的空间信息点让它们进行信息交流),代码如下:
for(int i = 节点; i; i -= i & (-i)){信息采集}
然后作差得到结果。
3175

被折叠的 条评论
为什么被折叠?



