繁体   English   中英

如何有效地回答整数数组中的范围查询?

[英]How to effectively answer range queries in an array of integers?

如何有效地对整数数组进行查询和定范围?

查询仅是一种类型 ,在给定范围[a,b] ,查找less than x sum of elementssum of elements (此处x是每个查询的一部分,以abx的形式abx )。

最初,我尝试从字面上看从a到b并检查当前元素是否小于x并相加。 但是,由于复杂度为O(n),所以这种方法效率很低。

现在,我正在尝试使用段树并在合并时对数字进行排序。 但是现在我面临的挑战是如果我进行排序,那么我将失去整数的相对顺序。 因此,当查询到来时,我无法使用排序数组从a到b获取值。

以下是使用段树解决此问题的两种方法:

方法1

您可以使用已排序数组的分段树。

与往常一样,段树将您的数组划分为一系列大小不同的子范围。 对于每个子范围,您将存储条目的排序列表以及该排序列表的累积总和。 然后,您可以使用二进制搜索在任何子范围内找到低于阈值的条目总数。

给出查询时,首先要计算出覆盖[a,b]范围的O(log(n))子范围。 对于每一个,您都使用O(log(n))二进制搜索。 总体而言,这是O(qlog ^ 2n)复杂度,无法回答q个查询(加上预处理时间)。

方法2

您可以使用动态细分树。

段树可让您以O(logn)时间回答“将元素从a到b的总和”形式的查询,还可以修改O(logn)中的单个条目。

因此,如果从空的段树开始,则可以按升序重新插入条目。 假设我们添加了从1到5的所有条目,那么我们的数组可能如下所示:

[0,0,0,3,0,0,0,2,0,0,0,0,0,0,1,0,0,0,4,4,0,0,5,1]

(0代表大于5的条目,因此尚未添加。)此时,您可以回答阈值为5的任何查询。

总的来说,这将花费O(nlog(n))将所有条目添加到分段树中,使用O(qlog(q))对查询进行排序,并花费O(qlog(n))使用分段树来回答查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM