重叠区间的最大子集数

问题描述

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

举个例子

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

关于输出

(11,75) => 6 -> (14,58)  
(14,62) => 3 -> (17,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*log(n)) 方法可以做到这一点。直觉是,我们需要某种方式来组织间隔,在当前步骤中,当前步骤可能包含的所有间隔都已被考虑在内。

算法如下:

  1. 按结束时间升序对间隔进行排序,并按开始时间降序对绑定的结束时间进行排序。
  2. 迭代间隔并维护所有看到的开始时间的排序集。这个想法是,当查看当前区间时,它可能包含的所有区间都已经被检查过,当前区间确实包含的区间数只是我们构建的元素数开始时间晚于的集合。

通过这个例子,我们首先发现

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

并让我们排序的一组间隔(现在按开始时间排序)为

examinedIntervals = []

现在让我们逐步完成sortedIntervals

  1. 考虑(17,32)examinedIntervals 为空,因此不包含任何内容。
  2. 考虑(24,48)examinedIntervals = [(17,32)]。因为没有在 24 之后开始的区间,所以 (24,48) 包含 0 个区间。
  3. 考虑(41,58)examinedIntervals = [(17,48)]。没有间隔在 41 之后有开始时间,因此 (41,58) 包含 0 个间隔
  4. 考虑(14,62)examinedIntervals = [(17,58)]。现在所有三个间隔的开始时间都在 14 之后,因此 (14,62) 包含 3 个间隔
  5. 考虑(31,71)examinedIntervals = [(14,(17,58)]。 31 之后只有一个区间,所以 (31,71) 包含 1 个区间
  6. 考虑(34,74)examinedIntervals = [(14,58)]。 1 个区间在 34 之后,所以 (34,74) 包含 1 个区间
  7. 考虑(11,75)examinedIntervals = [(14,58)],并且所有 6 个间隔的开始时间都在 14 点之后。
  8. 考虑(40,97)examinedIntervals = [(11,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))