从一点点摆弄的水平来看,这就是我们所拥有的:
g用于整数数据数组的普通BIT数组
a存储范围和。
g[k] = sum{ i = D(k) + 1 .. k } a[i]其中,
D(k)仅仅是
k具有最低阶1位设置为0。下面我们就来代替
T[k] = min{ i = D(k) + 1 .. k } a[i]该查询的工作方式与普通的BIT范围总和查询完全相同,只是随着查询的进行,子范围的最小值(而不是总和)有所变化。对于中的N个项目
a,N中有ceiling(log
N)个上限,它确定运行时间。
此更新需要更多的工作,因为O(log N)子范围最小值(即的元素)
g受更改影响,并且每个子集都需要自己进行O(log
N)查询来解决。这使得更新总体为O(log ^ 2 n)。
从有点麻烦的角度来看,这是非常聪明的代码。该语句
x += x &-x清除1中最低顺序的连续字符串,
x然后将下一个最高顺序的零设置为1。这正是您需要“遍历”原始整数的BIT的条件
x。



