二分索引树 | Binary Indexed Tree

二分索引树(BIT),即Binary Indexed Tree或Fenwick Tree,因其更新和查找操作的时间复杂度都为O(logN),常用于求数组区间和或最值等问题。应用范围和线段树(Segment Tree)重合,但相比于后者实现起来却更加容易。

要理解二分索引树,让我们来思考下面的一个问题:

我们有一个数组 arr[0 。. . n-1]。我们想

  1. 计算前 i 个元素的总和。
  2. 修改数组 arr[i] = x 的指定元素的值,其中 0 <= i <= n-1。

简单的解决方案

从0到i-1运行一个循环并计算元素的总和。要更新一个值,只需执行 arr[i] = x。第一个操作需要 O(n) 时间,第二个操作需要 O(1) 时间。另一个简单的解决方案是创建一个额外的数组并将第 i 个元素的总和存储在这个新数组的第 i 个索引处。现在可以在 O(1) 时间内计算给定范围的总和,但现在更新操作需要 O(n) 时间。如果有大量的查询操作但更新操作的数量很少,这很有效。

我们可以在 O(log n) 时间内同时执行查询和更新操作吗? 

答案当然是可以的,一种有效的方法是我们之前提到的线段树(Segment Tree),另一种便是我们今天要讨论的BIT(二分搜索树)。

表示

二叉索引树表示为一个数组。设数组为 BITree[]。二叉索引树的每个节点存储输入数组的一些元素的总和。二叉索引树的大小等于输入数组的大小,记为 n。但在实际代码中为了方便我们实现,通常会将数组大小设为n+1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值