如何在二进制索引树中实现范围更新和范围查询?

时间:2016-05-15 16:29:48

标签: data-structures fenwick-tree

我已经阅读了有关二进制索引树的一些教程,但是当查询和更新两个操作都在某个范围内时,我无法理解如何实现它。

1 个答案:

答案 0 :(得分:0)

要实现范围更新和范围查询,您需要了解范围更新和点查询(使用v更新[a,b];查询(x)给出A [x]处的值)。

我们将使用两个BIT来实现范围更新和范围查询。

让我们说数组初始化为0.如果我们用v更新[a,b],

For some x, sum(0,x) = 0     if 0 < x < a

                     = v*(x - (a-1)) if a <= x <= b

                     = v * (b - (a-1)) if b < x

where v is the value at A[x] (calculated via BIT1)

从上面的公式中,我们找到T,当从v * x中减去(v从BIT1计算得出)时,我们得到结果。

if 0 < x < a : sum(0,x) = 0, T = 0

   a <= x <= b: sum(0,x) = v*x - v*(a-1) , T = v*(a-1)

   b < x : sum(0,x)  = v*(b-a+1) , T = -v*(b-(a-1)) (since A[x] = 0 when x > b)

We store T in second BIT (BIT2)

现在,用v:

实现更新[a,b]
update(a,v) ; update(b+1,-v) in BIT1 and

update(a,v*(a-1)); update(b+1,-v*b) in BIT2

和[0,x]中:

QueryBIT1(x)*x - QueryBIT2(x); // call query() on corresponding BIT

其中,update(index,value)和Query(index)是用于点更新和范围查询的实现。

更多细节:

http://zobayer.blogspot.in/2013/11/various-usage-of-bit.html https://kartikkukreja.wordpress.com/2013/12/02/range-updates-with-bit-fenwick-tree/