我最近学习了Fenwick Tree (Binary Indexed Tree)数据结构。
查询时,我可以理解为什么要减去(idx& -idx)。 但是,我无法理解为什么在更新值时添加(idx& -idx)。
换句话说,我知道我们必须更新所有会因更新某个单个元素x而受影响的时间间隔,并且我知道BIT [x]是第一个被更新的,但是无法理解为什么下一个索引要更新的是BIT [x +(x& -x)]
感谢。
答案 0 :(得分:1)
以下是一个很好的解释:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees
关键思想是,如果f(i)是索引i的频率,则t(i)是所有(i - (r - 1))的累积频率.i其中r是最小的位在我您可以将r计算为r = i& -i
[编辑:上面我错误地写了(r - 1)为(2 ^ r - 1)。]
例如,如果i = 12 = 1100_2,则r = 100_2且t(i)= f(1001_2)+ f(1010_2)+ f(1011_2)+ f(1100_2)= f(9)+ f( 10)+ f(11)+ f(12)。
当从0 ... i计算累积频率时,基本上将i处的t值与移除的最小设置位的i相加,i除去至少两个设置位,...等等,直到我们用完为止比特。
例如,如果i = 12 = 1100_2,那么我们想要t(1100_2)+ t(1000_2)。
因此,如果更改f(i)处的值,则必须更改所有受影响的t值。这些是t(i),t(i + r),2t(i + r),4t(i + r),......等等,直到我们超过最后一个索引。对于索引j> = i的任何累积频率计算,这些正是我们要检查的受影响的t值。
[编辑:修复了最后一段中的'受影响的t值'序列以响应j_random_hacker的更正。]