寻找"最大" O(nlog(n))中的重叠区间对

时间:2016-09-04 01:15:04

标签: algorithm sorting search intervals

问题陈述

输入 一组n个区间; {[s_1,t_1],[s_2,t_2],...,[s_n,t_n]}。

输出 一对间隔; {[s_i,t_i],[s_j,t_j]},所有区间对中的最大重叠。

示例

输入间隔:{[1,10],[2,6],[3,15],[5,9]}

- >可能有6个区间对。在这些对中,[1,10]& [3,15]最大可能重叠7。

输出:{[1,10],[3,15]}

朴素算法将是一种强力方法,其中所有n个区间相互比较,同时跟踪当前最大重叠值。对于这种情况,时间复杂度为O(n ^ 2)。

我能够找到许多关于间隔树最大重叠间隔数最大非重叠间隔集的程序,但是这个问题没什么。也许我可以使用上述算法中给出的想法,但我无法想出一个。

我花了很多时间试图找到一个很好的解决方案,但我想我现在需要一些帮助。

任何建议都会有所帮助!

1 个答案:

答案 0 :(得分:12)

首先,对间隔进行排序:首先按左递增顺序排序,然后 - 作为次要标准 - 按递减顺序按右端点排序。对于本答案的其余部分,我将假设时间间隔已按排序顺序排列。

现在,最大可能重叠的可能性有两种:

  • 它可能介于完全覆盖的间隔和后续间隔之间。
  • 它可能介于完全覆盖的时间间隔和下一个时间间隔之间。

我们可以通过迭代间隔来覆盖O( n )时间的两种情况,并跟踪以下内容:

  • 到目前为止我们看到的最大重叠,以及相关的一对区间。
  • 我们见过的最新时间间隔,称之为 L ,其任何前辈都没有完全覆盖。 (为此,关键的见解是,由于时间间隔的顺序,我们可以很容易地判断一个时间间隔是否被其任何前任完全覆盖 - 因此,如果我们需要更新 L - 只需检查它是否被当前的 L 完全覆盖。所以我们可以在O(1)时间内保持 L 最新。)

并使用 L 计算每个区间的重叠。

所以:

result := []
max_overlap := 0
L := sorted_intervals[1]
for interval I in sorted_intervals[2..n]:
    overlap := MIN(L.right, I.right) - I.left
    if overlap >= max_overlap:
        result := [L, I]
        max_overlap := overlap
    if I.right > L.right:
        L := I

因此,总成本是对时间间隔进行排序的成本,可能是O( n log n )时间,但可能是O( n )如果你可以使用bucket-sort或radix-sort或类似的东西。