Algorithm 二叉索引树的实现,以便计算在给定间隔内小于给定数的整数数?

Algorithm 二叉索引树的实现,以便计算在给定间隔内小于给定数的整数数?,algorithm,data-structures,Algorithm,Data Structures,给定一个数组,如何在给定的间隔内计算和存储少于给定数量的元素数 e、 g.如果数组是{2 6 3 5 2}并且给定的是间隔{2 4}并且整数是6,那么答案应该是3 3.5.2小于6 请参见从1开始的间隔 早些时候,我尝试使用段树来做这件事,但没有找到任何解决方案 有人能提出可以做什么吗 我也试着阅读关于BIT的topcoder教程 有什么经典的算法可以做到这一点 e、 如果数组是{2 6 3 5 2},给定的是区间{2 4},整数是6,那么答案应该是3 3.5.2小于6 如果我正确理解了你的问题

给定一个数组,如何在给定的间隔内计算和存储少于给定数量的元素数

e、 g.如果数组是
{2 6 3 5 2}
并且给定的是间隔
{2 4}
并且整数是6,那么答案应该是3
3.5.2小于6

请参见从1开始的间隔

早些时候,我尝试使用段树来做这件事,但没有找到任何解决方案

有人能提出可以做什么吗

我也试着阅读关于BIT的topcoder教程

有什么经典的算法可以做到这一点

e、 如果数组是{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]+" "); */
//数组={2 6 3 5 2}
//区间={a,b}
//数字=n

对于(inti=a;i假设我们试图访问数据库,以查找在给定时间间隔内价格低于给定数字的时间

脱机处理 如果有许多查询可以一起处理,则可以使用此方法:

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是查询数

在线处理

如果有一次需要处理一个查询,那么您可以考虑使用A来存储可以快速搜索的2D数据结构中的元素。

树的每个节点都包含范围内元素的排序数组

构建段树
1.所有叶节点都包含单个元素,因此它们已被排序。
2.可以使用
std::merge
,(c++)有效地组合排序范围中的元素。
因此,您可以递归地构造段树。

在每次查询过程中,使用二进制搜索查找编号n的位置,
std::lowerbound
(c++)很好地实现了这一目的

“k=元素的位置>=n在范围内”

显然,在当前树段中,k值小于n。

经过一些搜索和思考后,我发现可以借助位和脱机处理来完成。
此链接将很有帮助

答案应为3。3 5 2是一个回答提示,所需的输出仅计数。@是的…这就是为什么我将
SOP
放在
…最终输出存储在变量
count
:)中的原因。如果需要搜索计数而不是数组,则没有什么比O(N)更快的保证不存在。@titбб:从哪里获得计数…?:)我的解决方案是
O(b-a)
,这在最坏的情况下等于
O(N)
)@NoobEditor您是对的,但是这不能用于10^5数组上的10^5查询。数组可能是在查询之间修改的,或者是静态的?另外,请提供数组的大小,以及可能的查询数量。数组项的最大值。@数组的大小可以是2*10^5,查询也是如此。实际上,如果我交换数组的两个元素,查询是为了找到数组中的反转总数。我认为,我们需要找到一个反转差,在查询数组被更改或恢复到初始状态后,我不确定反转差异是否会使其恢复。但是我想数一数初始反转的数量,然后我不知道我是否交换了两个元素,那么有多少元素会受到影响。如果你能给我一些建议,那么请告诉我这是一个解决这个问题的好方法。你能详细说明一下吗