Algorithm 大区间上的几何点和

Algorithm 大区间上的几何点和,algorithm,intervals,Algorithm,Intervals,我有一个很大的间隔[0…2^32-1]。大约有2^20个点具有某些坐标和值,例如: 1; 435 5; 5454 345345; 5485; 9999999; 43435 4294967294; 35353 我也有一套间隔。间隔数小于2^22。比如说, 1 3; // sum is 435 1 3535; // sum is 435 + 5454 99994 4294967294; // sum is 5485 + 43435 + 35353 对于每个区间,我必须计算模和2^32 有一种幼稚

我有一个很大的间隔
[0…2^32-1]
。大约有2^20个点具有某些坐标和值,例如:

1; 435
5; 5454
345345; 5485;
9999999; 43435
4294967294; 35353
我也有一套间隔。间隔数小于
2^22
。比如说,

1 3; // sum is 435
1 3535; // sum is 435 + 5454
99994 4294967294; // sum is 5485 + 43435 + 35353
对于每个区间,我必须计算模和
2^32

有一种幼稚的算法。我可以迭代每个间隔的所有点。它需要O(查询数*点数)。太慢了


有更快的算法吗?

对点进行排序。对点进行迭代,并计算每个点的值的运行总和。将总和存储在数组中。当你想计算一个区间的和时,通过二进制搜索找到下限和上限,然后查找下限和上限。这些和的差就是区间的和

对于您给出的示例,点的索引如下所示:

{0: 1, 1: 5, 2: 345345, 3: 9999999, 4: 4294967294}
总额如下:

{0: 0, 1: 435, 2: 5889, 3: 11374, 4: 54809, 5: 90162}
要计算区间
[a..b]
中的和,请找到不大于
a
b
的最小点的索引
p(a)
p(b)
,并返回
和[p(b)+1]-和[p(a)]

对于1和3,我们找到了指数0和0。结果是
sums[1]-sums[0]

对于1和3535,我们找到了指数0和1。结果是
sums[2]-sums[0]

对于99994和4294967294,我们找到了指数2和4。结果是
sums[5]-sums[2]


准备和数组需要O(点数)。每个查询都需要O(log(点数))。

我认为在阅读结构时可以准备好,这样您就可以在O(1)中计算所需的总和。因此,查询将进行O(2*ln)操作。但是它看起来像一个竞赛项目。通过对点列表进行排序并使用二进制搜索,你可以轻松地做得比简单的解决方案更好,但我猜还有更快的方法。你能用多少内存?@japreiss,我试过这种方法。它也很慢。我可以使用256个RAM。上限包括总数吗?换言之,
15
的总和是
435
还是
435+5454
?@japreis,总和包含在上端。
15
的总和为
435+5454