回答二进制数组的查询

时间:2013-05-30 16:27:25

标签: c++ arrays algorithm intervals

给定长度< = 10 ^ 5 的二进制数组和几乎相同数量的查询。每个查询由两个整数(l,r)给出,对于我们计算机的每个查询,连续 0 的总数和 1 [l,r] 范围内。

如果 n 是数组的长度,那么 1< = l< r< = n

例如:

如果二进制数组( 1 -indexed)为“ 011000 ”并且说有5个查询:

  

1 3
  5 6
  1 5
  3 6
  3 4

然后所需的答案是

  

1
    1
  2
   2
   0

我知道这可以通过每个查询的线性时间(最坏情况)算法来解决,但是由于大量的查询,这是不可行的。

只是想知道哪种方法最有效?

2 个答案:

答案 0 :(得分:0)

您可以使用O(n)空间复杂度和每个查询的O(log(n))搜索时间来完成此操作。计算大小为1,2,4的窗口的计数....对于给定的查询,您可以找到O(log(n))窗口(最多2个特定大小的窗口),求和,您可以找到答案

答案 1 :(得分:0)

正如Dukeling在评论中所说,你可以在O(n)中预处理来计算一个数组B,其中B [x]包含在[1..r]中看到的连续数字的总数。

这允许O(1)中的查询通过使用数组来计算范围[1,r]中的总数并减去数字中的数字来查找范围[l,r]中的连续数字的数量。范围[1,l]。

Python代码:

def preprocess(A):
    last=A[0]
    B=[0,0]
    num_consecutive=0
    for a in A[1:]:
        if a==last:
            num_consecutive+=1
        B.append(num_consecutive)
        last=a
    return B

def query(B,l,r):
    return B[r]-B[l]

A=[0,1,1,0,0,0]
B=preprocess(A)

print query(B,1,3)
print query(B,5,6)
print query(B,1,5)
print query(B,3,6)
print query(B,3,4)