给定一个数组,如何在给定的时间间隔内计算和存储小于给定数字的元素数。
e.g。如果数组是{2 6 3 5 2}
并且给定的是区间{2 4}
并且整数是6则则回答应为3
3 5 2小于6。
请参阅从1开始的间隔。
之前我尝试使用分段树来做这件事,但无法提出任何解决方案。
任何人都可以建议可以做些什么?
我也尝试在BIT上阅读topcoder教程。
有没有经典的算法来做到这一点。
答案 0 :(得分:1)
假设我们正在尝试访问数据库,以查找在给定时间间隔内价格低于给定数量的时间。
如果您有多个可以一起处理的查询,那么您可以使用此方法:
For each query for an interval between a and b, store a and b in a sorted dictionary that maps from the important times (a and b) to the query
For each price in time order:
Add the price to a Binary Indexed Tree (BIT)
Use the sorted dictionary to find all queries that can now be answered
For each of these queries use the BIT to count the number of elements less than the number
这回答了O((n + q)(log(q)+ log(n)))中的查询,其中n是元素的数量,q是查询的数量
如果您有一个需要一次处理的传入查询,那么您可以考虑使用KD-tree将元素存储在可以快速搜索的2d数据结构中。
答案 1 :(得分:1)
使用分段树,
树的每个节点都包含
范围内的有序元素数组
构建分段树
1.所有叶节点都包含单个元素,因此它们已经排序。
2.可以使用std::merge
,(c ++)有效地组合排序范围中的元素。
因此,您可以递归地构造段树。
在每次查询期间,使用二进制搜索来查找number n
的位置,std::lowerbound
(c ++)可以很好地用于此目的。
' k =元素的位置> = n在范围'
显然,当前树段中有k values
小于n。
答案 2 :(得分:1)
答案 3 :(得分:0)
e.g。如果数组是{2 6 3 5 2}并且给定的是区间{2 4}且整数是6则则回答应为3 3 5 2小于6。
如果我正确地理解了你的问题,我真的看不到使用极端数据结构(实际上是一种过度杀伤)一个单通道的数组绰绰有余解决这个问题。
一种简单的方法是从较低的间隔循环,一直到最高的间隔,同时在遍历过程中比较数字。
//array = {2 6 3 5 2}
//interval = {a,b}
//number = n
for(int i = a;i<=b;i++)
if(arr[i] < n)
count++; /* OR system.out.println(arr[i]+" "); */
这是在O(1)存储器和O(b-a)时间复杂度
中完成的