树状数组

本文介绍了一种高效的数据结构——树状数组(Binary Indexed Tree, BIT 或 Fenwick Tree),该结构支持在对数时间内完成区间查询和单点更新操作。文章详细展示了树状数组的基本原理、实现方法及其应用实例。
树状 数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;
经过简单修改可 以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个 元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询)。其实现如下:
int lowbit(int pos){
        return pos&(-pos); //找出最后的1,并计算出低位有1的值,如6,二进制为110,则求出为10, }
//由下面的规律可得,树状数组在相应位置会累计数据 void add(int pos, int value){ while(pos < c.size()){ c[pos] += value; pos += lowbit(pos); }
}
//求和的时候由于在相应位置有累积数据,需跳跃 int sum(int pos){ int res = 0; while(pos > 0){ res += c[pos]; pos -= lowbit(pos); } return res; }
树状数组以4为周期,找规律如下:
C1 = A1
C2 = A1 + A2
C3 = A3
C4 = A1 + A2 + A3 + A4
C5 = A5
C6 = A5 + A6
C7 = A7
C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8
...
C16 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10 + A11 + A12 + A13 + A14 + A15 + A16
树状图可能看起来会更直观
Range Sum Query - Mutable 

leetcode中的一个题目




转载于:https://www.cnblogs.com/zhaoweiblog/p/5897923.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值