多次查询无序序列中指定区间内某元素个数


题目

区间内查询数字的频率

前期分析

多次查询 的存在大概率需要进行预处理
下面讨论预处理的不同方式

预处理各个元素在各个位置及以前的出现次数

区间 的存在指向了

实施方案
需要枚举每一个可能的元素,遍历序列预处理该元素对应位置及以前的出现次数

局限性
显然,这样预处理的方式是O(n^2)的,因此在某些场景下,前缀和预处理的过程可能会 TLEMLE,仅适用于数据量较小但查询量较大的场景

预处理各个元素出现的位置

上述的预处理方式是很容易想到的,一般是第一思路,但时间复杂度和空间复杂度都很差

实施方案
可以保存各个元素出现的位置,存储其在原数组中的数组下标

  1. 对于指定区间[Left, Right]内某元素个数,可以遍历预处理结果,统计处在区间内部的个数,但这样做复杂度本质上并没有改变(这种统计数量的方法同距离计算的方法1)
  2. 可以发现,预处理结果是有序的,我们的目标是找到有序数组中处在[Left, Right]内的元素个数,若能够确定>= Left的最小元素的位置 和 <=Right的最大元素的位置,两者在预处理数组中的下标差值+1即为待求元素个数(这里统计数量的方法同距离计算的方法2)
    有序数组中查找某值显然可以通过二分实现

为何降低了复杂度
同第一种预处理方式相比,现在这种方式能够保存更多的信息,可利用信息越多,可操作的方案越多,复杂度降低的可能性也就越大

相关