树状数组入门(超详细)每步举例说明浅显易懂,没看懂的话欢迎交流!!

树状数组

看了很多写树状数组的,感觉各有优缺点,索性就按照自己的理解顺序梳理一下。

简介

树状数组(Binary Indexed Tree, Fenwick Tree),是一种用于高效处理对一个存储数字的列表进行更新及求前缀和、区间和的数据结构。
什么是前缀和以及区间和?前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。 区间和就是给定区间的数组的和。
它的查询和修改的时间复杂度都是log(n),空间复杂度则为O(n)。这正是使用树状数组的原因。
(碰到更新元素、求前缀和、区间和就可以考虑树状数组)。

举例理解

首先我们很关心一个普通数组是怎么变成树状数组的。最上面一行为A数组,最下面一行为C数组
先看上图(最上面一行为A数组也就是原始数组,最下面一行为C数组,改变之后的树状数组)可以看出:
1=(001) C[1]=A[1];
2=(010) C[2]=A[1]+A[2];
3=(011) C[3]=A[3];
4=(100) C[4]=A[1]+A[2]+A[3]+A[4];
5=(101) C[5]=A[5];
6=(110) C[6]=A[5]+A[6];
7=(111) C[7]=A[7];
8=(1000) C[8]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8];

接下来引入lowbit:我们主要是求一个数字的二进制表示的1所在的最低位(k),而lowbit=2^k。
举例:

十进制 二进制 lowbit
2 0010
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值