Fenwick树总和查询

时间:2016-10-10 12:23:39

标签: string binary logic binary-indexed-tree

这是从索引0到索引X的总和查询的代码

Int query(int x){ 
Int sum=0;
for(; x>0; x -= x &(-x) )
   sum += BIT[x]; 
 Return sum; 
 }

我有两个数组BIT[] and a[]。我将数组a的值存储到BIT以进行查询。现在根据循环,我们所做的是在索引X处添加值,然后通过从中删除最后一个设置位来更改索引。

例如,如果我调用query(14),它将按如下方式执行:

  

Sum = BIT [14] + BIT [12] + BIT [8]

它将在索引8之后停止,因为8是1000并且在移除最后一位之后它变为0并且循环结束。这意味着索引14 I.e 1110我访问数组3次,即e是设置位数。但是我检查了长位,它失败了,例如1000110111011101100设置位是11,但答案是12。 那么有没有其他方法可以通过查看索引I 的二进制值来判断在执行sum查询期间访问数组的次数?

我无法弄明白。我尝试了很多案例,因为有些情况下它少于1,有些情况下它更多的是1,而对某些情况来说它实际上就是答案。

请帮帮我。

1 个答案:

答案 0 :(得分:1)

访问次数正是二进制表示中的次数。这是简短的Python(Python只是因为我很懒)脚本,如果不是任何小于1000000的数字就会打印出来的东西

def count(x):
  ones = 0
  for ch in bin(x): 
    if ch =='1':
      ones = ones + 1
  return ones

access = 0;
for y in range(1000000):
  access = 0
  x = y
  while x > 0:
    x = x -(x & (-x))
    access = access + 1
  if count(y) != access:
    print "Wrong:"+str(y)