树状数组的空间解析

线性数组是元素的排列,而树状数组是空间的排列。为什么是空间的排列呢?

1
10
11
100
101
110
111
1000
1001
1010
1011
1100
1101
1110
11111

如图,这是一个树状数组,我们把它定义为原始空间,树的每层定义为一个子空间,这些子空间镶嵌在原始空间上,我们再定义每层的首个节点为空间信息点。我们就拿第四个子空间为例,它的内部结构(除去空间信息点)(这里省略了1个前缀1)如图:

1
10
11
100
101
110
111
空间信息点1000
空间信息点10000

把这个原始空间的子空间定义为二重空间,我们接着把二重空间的第二个子空间展开,如图:

11
空间信息点10
空间信息点100

按照前面的说法这就是三重空间了,不难发现,在原始空间中元素含1的个数代表了该元素是第几重空间的空间信息点。

然后,我们探讨一下树状数组信息传递的机制,比如:
1.对某个节点的修改,信息会不断向上一重空间传递(由对应的后一个空间信息点接受后再传递),到达原始空间之后信息会不断向原始空间的下一个空间信息点传递。 代码的实现
for(int i = 节点; i <= 自定义终点;i += i & (-i)) {信息更新}
2.对某段区间的统计,节点会不断向上一重空间进行采集信息(由对应的前一个空间系信息点给予反馈),到达原始空间之后就会终止,这样就保证了对前面每一个节点的信息只采集过一次(提示:信息更新是的路径是向后无限延伸的,而信息采集的路径是向前有限延伸的,所以一定有唯一的空间信息点让它们进行信息交流),代码如下:
for(int i = 节点; i; i -= i & (-i)){信息采集}
然后作差得到结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值