二进制索引树(范围更新和点查询)

时间:2016-07-16 20:08:58

标签: algorithm binary-indexed-tree

当我们进行范围更新时,有人可以帮助我理解二进制索引树 - 为什么我们不更新每个元素为什么只有起始元素和结束元素

例如0

我们必须在BIT中为arr [x]更新数组元素范围到arr [y] 。根据二进制索引树点更新功能。它将更新索引x和所有那些索引的累积频率>比通过更新而受影响的x。

但是如果我们使用点更新函数进行范围更新。那么为什么我们不使用点更新函数更新大于x且小于y的每个索引。 由于范围更新意味着每个元素都应该用值更新,更新起始索引和一个以上结束索引如何覆盖所有更新

为什么我们没有这样做

............................................... ...

 for (i =[x] to [y])
    pointupdate(ar[i],val);// why we are not doing this 

update(p, v): //point update
  for (; p <= N; p += p&(-p))
    ft[p] += v   

# Add v to A[a...b] 
update(a, b, v):     // why we are using this only for update of one element how other elements greater than a will be coverd
  update(a, v)     
  update(b + 1, -v)     

1 个答案:

答案 0 :(得分:0)

更新BIT[a]+=v时,这意味着对每个索引x>=a的查询都会看到v增量。

要以这种方式执行范围更新,请在范围开始时递增v,在范围结束后递减v。这意味着只有ab之间的增量才会显示。