重叠区间的最大子集数

Posted

技术标签:

【中文标题】重叠区间的最大子集数【英文标题】:Maximum number of subsets of overlapping intervals 【发布时间】:2021-06-15 04:02:31 【问题描述】:

给定一组区间 S,从集合 S 中找到分配给每个区间的子集数的有效方法是什么。

举个例子

S = (11,75), (14,62), (17,32), (24,48), (31,71), (34,74), (40,97), (41,58)

至于输出

(11, 75) => 6 -> (14,62), (17,32), (24,48), (31,71), (34,74), (41,58)  
(14, 62) => 3 -> (17,32), (24,48), (41,58)   
(17, 32) => 0  
(24, 48) => 0  
(31, 71) => 1 -> (41,58)   
(34, 74) => 1 -> (41,58)  
(40, 97) => 1 -> (41,58)  
(41, 58) => 0

是否有可能在 o(nlogn) 或远小于 o(n2 )

【问题讨论】:

我猜这仍然是 o(n^2)。如果我错了,请纠正我。 是否保证输入按间隔开始排序? 我们知道与区间数相比值范围的大小吗? IE。 max_val - min_val vs num_ranges? @Dave 不能保证输入已排序。我在玩箱子,所以用这个作为例子。此外,对于间隔数的值范围,我们一无所知。 【参考方案1】:

似乎有一种 O(n*log(n)) 方法可以做到这一点。直觉是,我们需要某种方式来组织区间,以便在当前步骤中考虑当前可能包含的所有区间。

算法如下:

    按结束时间升序对区间进行排序,并按开始时间降序对绑定的结束时间进行排序。 遍历间隔并维护所有可见开始时间的排序集。这个想法是,在查看当前区间时,它可能包含的所有区间都已经被检查过,当前包含的区间数只是我们构建的元素的数量设置的开始时间比当前时间。

遍历示例,我们首先发现

sortedIntervals = [(17,32), (24,48), (41,58), (14,62), (31,71), (34,74), (11,75),(40,97)]

让我们排序的间隔集(现在按开始时间排序)是

examinedIntervals = []

现在让我们逐步了解sortedIntervals

    考虑(17,32)examinedIntervals 为空,因此不包含任何内容。 考虑(24, 48)examinedIntervals = [(17, 32)] 。因为没有从 24 开始的区间,所以我们认为 (24, 48) 包含 0 个区间。 考虑(41, 58)examinedIntervals = [(17, 32), (24, 48)]。没有间隔在 41 之后有开始时间,所以 (41, 58) 包含 0 个间隔 考虑(14, 62)examinedIntervals = [(17, 32), (24, 48), (41, 58)]。现在所有三个区间的开始时间都在 14 之后,所以 (14, 62) 包含 3 个区间 考虑(31, 71)examinedIntervals = [(14, 62), (17, 32), (24, 48), (41, 58)]。 31 之后只有一个区间,所以(31, 71) 包含 1 个区间 考虑(34, 74)examinedIntervals = [(14, 62), (17, 32), (24, 48), (31, 71), (41, 58)]。 34 之后有一个区间,所以(34, 74) 包含 1 个区间 考虑(11, 75)examinedIntervals = [(14, 62), (17, 32), (24, 48), (31, 71), (34, 74), (41, 58)],所有 6 个区间的开始时间都在 14 点之后。 考虑(40, 97)examinedIntervals = [(11, 75), (14, 62), (17, 32), (24, 48), (31, 71), (34, 74), (41, 58)]。 40 之后只有一个区间,因此(40, 97) 包含 1 个区间。

总结我们确实得到了正确的结果:

(40, 97) -> 1
(11, 75) -> 6
(34, 74) -> 1
(31, 71) -> 1
(14, 62) -> 3
(41, 58) -> 0
(24, 48) -> 0
(17, 32) -> 0

还可以很容易地验证运行时间是 O(n*log(n)),假设在第二部分中使用了高效排序和平衡树。初始排序在给定的时间内运行。第二部分涉及 n 次插入高度为 O(log(n)) 的二叉树,运行时间为 O(nlog(n))强>。因为我们将在 O(nlog(n)) 中运行的两个步骤相加,所以总体运行时间为 O(nlog(n))

【讨论】:

以上是关于重叠区间的最大子集数的主要内容,如果未能解决你的问题,请参考以下文章

区间树中的最大非重叠区间

最大不重叠区间

使用间隔树的最大间隔重叠[关闭]

1133 不重叠的线段 (贪心算法,最大区间不重合问题)

区间的最大重叠次数

51Nod 1091 线段重叠 贪心 区间重叠