【问题标题】:How many times an index appear on a range of intervals?一个索引在一个区间范围内出现了多少次?
【发布时间】:2014-11-10 19:42:50
【问题描述】:

我在 [1,n] 中有一个 k 个整数区间数组,其中 k ≤ 105n ≤ 105。例如,如果 k 为 3 且 n 为 5,则列表可能为:{[1,4]、[3,5]、[2,3]} .

对于这个区间数组的任意子数组,我希望能够计算有多少区间包含给定值。例如,在上面的示例数组中,我可能会取索引 1 到索引 2 的子数组(即 {[1,4], [3,5]})并计算该子数组中包含的区间数值 2(只有 1:[1,4])。此查询将表示为 3 元组 (min_index,max_index,value),在本例中为 (1,2,2)。

我的想法是从区间数组构建一个分段树,其中每个节点都包含位于该节点上的排序区间(按其起始索引排序)。例如:根将包含所有按起始索引升序排序的区间,其左孩子将包含区间数组前半部分的排序区间,右孩子将包含后半部分的排序区间,依此类推。

所以为了解决一个查询(min_index,max_index,value),我可以遍历树,只要我在一个完全在 [min_index,max_index] 内的节点我可以对间隔进行二进制搜索并计算出现次数。在最坏的情况下,每个查询都会进行O(log^2n) 操作。

我们还能做得更好吗?有没有办法先处理数据,然后在恒定时间内回答每个查询?

【问题讨论】:

  • 当你说l<=index<=r时,你的意思是区间数组中区间的索引是有界的吗?或者它的端点以某种方式有界? indexidx 一样吗?
  • 这是哪种编程语言?到目前为止你写过代码吗?如果这是一个普遍问题,也许您应该尝试使用Programmers 站点。
  • ...和第一个大小为N 的数组的内容无关?您正在处理多少个查询?
  • @nneonneo 只是区间数组中区间的索引。换句话说,LthRth 间隔。
  • Re:“有没有办法先处理数据,然后在恒定时间内回答每个查询?”:从 CS 理论的角度来看,是的:你有一个有限域,所以如果没有别的,您可以预先计算所有可能查询的答案。 (当然,这需要 O(k²n) 内存,所以如果这是唯一的方法,那就不值得了!)

标签: algorithm data-structures


【解决方案1】:

您可以使用扫描线算法更轻松、更快速地离线解决它:

  1. 事件是:查询范围开始,查询范围结束。

  2. 每个区间将初始数组中的一个段加 1。

  3. 要处理第一类事件,需要获取给定位置的当前总和。

因此,您需要一个支持两种操作的数据结构:将值添加到范围和获取单个元素的值。这里有两种选择:

  1. 分段树:它给出 O((k + q) * log n) 时间复杂度。

  2. Sqrt 分解:O(sqrt(n) * k + q)。

第二个选项为每个查询提供 O(1) 时间(不计算第一项,因为它不依赖于 q)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2011-01-15
    • 1970-01-01
    • 2017-05-21
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多