问题陈述
输入 一组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)。
我能够找到许多关于间隔树,最大重叠间隔数和最大非重叠间隔集的程序,但是这个问题没什么。也许我可以使用上述算法中给出的想法,但我无法想出一个。
我花了很多时间试图找到一个很好的解决方案,但我想我现在需要一些帮助。
任何建议都会有所帮助!
答案 0 :(得分:12)
首先,对间隔进行排序:首先按左递增顺序排序,然后 - 作为次要标准 - 按递减顺序按右端点排序。对于本答案的其余部分,我将假设时间间隔已按排序顺序排列。
现在,最大可能重叠的可能性有两种:
我们可以通过迭代间隔来覆盖O( n )时间的两种情况,并跟踪以下内容:
并使用 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或类似的东西。