完全位于特定范围内的范围数

时间:2013-08-08 11:14:25

标签: algorithm

我们假设我们有n个范围,每个范围由

指定
 [l_i,r_i] where 1<=i<=n

我们有一个类型为[L,R]的查询,其中我们必须找到在给定范围内完全的n个范围中的范围数,即[L,R] < / p>

示例:

n范围是:

这里n是2。

2 4
3 3

对于查询3 5,输出应为1.

对于查询2 5输出应为2.

我知道O(m * n)的方法,其中n是范围数,m是查询数,但感觉必须有更高效的实现。

2 个答案:

答案 0 :(得分:1)

是的,有。您想要的数据结构称为interval tree

答案 1 :(得分:0)

对于以下解决方案,每个查询都有复杂度O(log(n)),但它需要存储(n ^ 2/2)范围,并且预处理需要对范围进行排序(复杂度O(n * n log(n))使用quicksort):

预处理:

  1. 按L_i
  2. 对n个范围进行排序
  3. 对于每个范围[L_i,R_i]:

    a)找到L_j> = L_i为真的所有范围[L_j,R_j]的子集S_i。

    b)按R_j

  4. 排序S_i

    查询[L,R]:

    1. 找到具有最小L_i的S_i,使得L_i> = L使用二分搜索(复杂度O(log(n))。S_i包含所有候选范围。
    2. 在S_i中找到最大的R_j,使得R_j&lt; = R再次使用二分搜索。此条目的索引对应于满足条件的范围数。
    3. 让我们回到你的例子: S_1:[3 3] [2 4] S_2:[3 3]

      1. 查询3 5在S_2中结束。显然,有一个条目也满足第二个条件

      2. 查询2 5在S_2中结束。第二个条目是满足R条件的最大条目,因此结果是2