二维数组的计数算法

时间:2014-02-20 11:14:20

标签: arrays algorithm sorting count

如果我有一个2D数组(2列,10000行,下面的示例),其中第一列是一些数值,第二列是指标(1或0)。什么是有效的算法(就计算速度而言)来计算2个数值之间的1的数量,例如200到800之间? 一个2D数组示例:

#2A((315 1)
    (1941 1)
    (1914 0)
    (970 1)
    (1600 0)
    (283 0)
    (843 0)
    (1831 1)
    (1584 1)
    (1918 1)
        ...)

2 个答案:

答案 0 :(得分:1)

如果你的数组没有排序,你可以做任何事情,但是去数组的每一对(a,b)检查a是否在边界内并且b = 1.这显然是O(n)算法。

答案 1 :(得分:1)

方法1

如果您只想执行一次操作,那么您不能比O(n)做得更好,因为您需要至少检查一次每个条目:

for each item
  if low<=item[0]<=high and item[1]==1:
     count += 1

方法2

如果你想做多个查询,那么一种方法是丢弃0的所有项目,对其余项目进行排序,然后对每个查询使用二分法来查找给定范围内的项目数。

对于每个查询,这将是排序的O(nlogn)(这只需要执行一次)加上O(logn)。

方法3

如果您的数字在长度B的固定范围内,那么您可以设置一个数组,其中包含每个数据库中有多少项(值为1),然后计算此数组的累积总和。

这将给出O(n + B)预处理时间,加上每个查询的O(1)