【发布时间】:2014-11-10 19:42:50
【问题描述】:
我在 [1,n] 中有一个 k 个整数区间数组,其中 k ≤ 105 和 n ≤ 105。例如,如果 k 为 3 且 n 为 5,则列表可能为:{[1,4]、[3,5]、[2,3]} .
对于这个区间数组的任意子数组,我希望能够计算有多少区间包含给定值。例如,在上面的示例数组中,我可能会取索引 1 到索引 2 的子数组(即 {[1,4], [3,5]})并计算该子数组中包含的区间数值 2(只有 1:[1,4])。此查询将表示为 3 元组 (min_index,max_index,value),在本例中为 (1,2,2)。
我的想法是从区间数组构建一个分段树,其中每个节点都包含位于该节点上的排序区间(按其起始索引排序)。例如:根将包含所有按起始索引升序排序的区间,其左孩子将包含区间数组前半部分的排序区间,右孩子将包含后半部分的排序区间,依此类推。
所以为了解决一个查询(min_index,max_index,value),我可以遍历树,只要我在一个完全在 [min_index,max_index] 内的节点我可以对间隔进行二进制搜索并计算出现次数。在最坏的情况下,每个查询都会进行O(log^2n) 操作。
我们还能做得更好吗?有没有办法先处理数据,然后在恒定时间内回答每个查询?
【问题讨论】:
-
当你说
l<=index<=r时,你的意思是区间数组中区间的索引是有界的吗?或者它的端点以某种方式有界?index和idx一样吗? -
这是哪种编程语言?到目前为止你写过代码吗?如果这是一个普遍问题,也许您应该尝试使用Programmers 站点。
-
...和第一个大小为
N的数组的内容无关?您正在处理多少个查询? -
@nneonneo 只是区间数组中区间的索引。换句话说,
Lth到Rth间隔。 -
Re:“有没有办法先处理数据,然后在恒定时间内回答每个查询?”:从 CS 理论的角度来看,是的:你有一个有限域,所以如果没有别的,您可以预先计算所有可能查询的答案。 (当然,这需要 O(k²n) 内存,所以如果这是唯一的方法,那就不值得了!)