我正在尝试解决以下问题:给定N个时间区间,每个区间都指定为(开始时间,结束时间),不重叠,并按照开始时间排序 - 找到包含给定日期的区间。例如,给定:
[1,4] [5,8] [9,10][11,20]
3落入第一个区间,15落入第四个区间等。
到目前为止我有以下基本想法:
- 我们可以使用二分查找来找到相应的区间(Log N)
- 由于可能只有少数几个区间很大,其余小,因此按照它们的持续时间对区间进行排序可能是值得的。然后,从统计学上讲,大多数情况下我们会“命中”最长的区间(O(1)),只有有时会导致最坏情况复杂度为N。
我在考虑是否有结合这两种方法的空间。另一个想法是根据持续时间排序并将所有区间插入树中,比较开始日期。在最坏的情况下,当最长的持续时间按时间顺序排列时,这种方法和2的性能相同。
我想象中的理想解决方案是拥有一个树(或类似的数据结构),其中包含最长的区间,然后两个分支就会有接下来的两个最长的区间等等。然而,我看不到在该树中分支的方法,即由于我们根据长度进行显式假设,因此我们无法真正丢弃树的左侧或右侧。
任何评论都将不胜感激。