树状数组(Binary Indexed Tree) 总结(ing)

树状数组是一种高效的数据结构,用于单点更新和区间查询,复杂度为O(logn)。它通过前缀和思想实现,与线段树相比,空间和速度更优,但限制数据可加减。树状数组结点表示一段原数组的连续区间和,更新操作影响Ci及其祖先结点,求和操作则涉及前缀和计算。经典模型包括点更新、段求和,段更新、点求值,逆序模型和二分模型等。
摘要由CSDN通过智能技术生成

推荐一篇很好的博客:http://www.cppblog.com/menjitianya/archive/2015/11/02/212171.html

一、树状数组的定义

基本定义:树状数组是利用二分的思想使得查询和修改的复杂度都为 log(n) 的数据结构,树状数组是通过前缀和思想,用来完成单点更新和区间查询的数据结构。

æ ç¶æ°ç»çå­å¨æ¹å¼

如上图,不难看出树状数组是一个不断地二分的过程。 

如上图,其中A为普通数组,C为树状数组(C在物理空间上和A一样都是连续存储的)。树状数组的第4个元素C4的父结点为C8 (4的二进制表示为"100",所以k=2,那么4 + 2^2 = 8,下面会具体讲解树状数组节点的含义),C6和C7同理。C2和C3的父结点为C4,同样也是可以用上面的关系得出的,那么从定义出发,奇数下标一定是叶子结点。 

 

谈到树状数组就很有必要谈一下线段树,下图就是一个线段树:

BIT structure

于是删除了线段树的所有右儿子,发现就形成了树状数组。与线段树相比,所用空间更小,速度更快,而且编程的复杂难度也大大减小。但是这里有一个前提条件,也是树状数组的缺陷:节点的数据必须是可加减,而且要满足a + b = c,c - a = b,比如集合运算,是不能通过父节点和左子节点 来计算右子节点的。

和ST相比,树状数组可以动态更新数据。

 

二、结点的含义

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值