如何确定范围中有多少元素在另一个给定范围内?

时间:2016-02-29 16:23:30

标签: algorithm binary-tree segment-tree

我需要一点帮助才能弄明白:

给定一系列无序数字(小于15.000) - A - 我必须回答 Q 查询(Q&lt; i,j,x,y 形式的<100000),其翻译如下:

A中范围[i,j]中的数字大于(或等于)x,但小于y ,且序列中的所有数字都小于5000.

我认为这需要类似O(logN)的东西,因为序列的长度很长,这让我想到了BIT(二进制索引树 - 因为查询)但是2D BIT太大而且需要即使在更新方面也可以运行很多时间。所以我在这里看到的唯一解决方案应该是1D BIT或Segment Trees,但我无法想出如何根据这些数据结构制定解决方案。我尝试保留有序数字集中的位置,但我无法弄清楚如何制作响应给定表单查询的BIT。

对于给定的限制,算法也应该符合 500ms 。 对于预处理和回答查询的所有操作,编辑1: 500毫秒

编辑2:其中i,j是序列A中第一个和最后一个元素的位置,用于查找大于x且小于y的元素

编辑3:示例: 让位置1和4(包括)之间有1,3,2,4,6,3和查询1,4,3,5,有2个元素(3和4)大于(或等于)3和更小比5

提前谢谢! P.S:对不起的英语很抱歉!

1 个答案:

答案 0 :(得分:2)

通过制作BIT组织的排序子阵列数来实现2D范围计数。例如,在输入

[1, 3, 2, 4, 6, 3]

oracle将是

[[1]
,[1, 3]
,[2]
,[1, 2, 3, 4]
,[6]
,[3, 6]
].

空间使用量是O(N log N)(希望很好)。如果你小心,构建需要O(N log N)时间,否则构建需要O(N log ^ 2 N)时间(没有理由为你的应用程序做法)。

要回答序列索引和值最大值的查询(其中四个可用于回答输入查询),请使用数组中的二进制搜索来计算最大索引的BIT读取过程以计算元素数量不超过最大值。查询时间为O(log ^ 2 N)。