如果我有一个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)
...)
答案 0 :(得分:1)
如果你的数组没有排序,你可以做任何事情,但是去数组的每一对(a,b)检查a是否在边界内并且b = 1.这显然是O(n)算法。
答案 1 :(得分:1)
如果您只想执行一次操作,那么您不能比O(n)做得更好,因为您需要至少检查一次每个条目:
for each item
if low<=item[0]<=high and item[1]==1:
count += 1
如果你想做多个查询,那么一种方法是丢弃0的所有项目,对其余项目进行排序,然后对每个查询使用二分法来查找给定范围内的项目数。
对于每个查询,这将是排序的O(nlogn)(这只需要执行一次)加上O(logn)。
如果您的数字在长度B的固定范围内,那么您可以设置一个数组,其中包含每个数据库中有多少项(值为1),然后计算此数组的累积总和。
这将给出O(n + B)预处理时间,加上每个查询的O(1)