假设您有一组间隔(长度不一定是整数)。如何确定给定集合中任何两个间隔之间是否存在重叠?我想知道是否有间隔数的线性解决方案。
P.S:不是硬件问题。在我对一家公司的采访中提到了这一点。
答案 0 :(得分:12)
如果所有间隔都按起点排序,那么很容易检查是否有两个间隔重叠。只需扫描所有间隔,保持我们从先前间隔获得的最大终点,如果最大终点>当前的起点,然后我们得到重叠。如果我们没有为所有间隔重叠,那么就没有重叠。
如果间隔未排序。然后通常检测重叠的下限是O(n logn)。因为当所有间隔都有start_point = end_point时,问题就会减少到清晰度问题。 http://en.wikipedia.org/wiki/Element_distinctness_problem。所有基于比较的算法都需要O(n log n)时间。
然而,如果所有间隔的点都是离散的并且在某个范围[0,L]中,例如,一天中的秒数从0到60 * 60 * 24,然后可以在O(n + L)线性时间和O(L)空间中求解。
这个想法是,每个区间i都有一个起点si和终点ei。我们创建一个数组a = new int [L]。对于每个区间i,我们将[si]加1加到[ei]。然后我们检查是否有a [j]> 1,如果是这样我们得到重叠。
最天真的方法是使用2 for循环,时间复杂度为O(n * L)。在Programming Peals中有一个聪明的算法可以将运行时间减少到O(n + L)。如果您感兴趣并且这是您的面试官想要的,我可以向您展示详细信息。
所以,这就是我所知道的3种情况。您认为哪一个适合您的问题。
答案 1 :(得分:1)
查看名为Interval Tree的数据结构。这用于查找重叠间隔。
如果间隔按其起始值排序,则这是O(n)中的一个简单问题。
另一种方法是在大小为m的数组中标记每个区间,并逐步检查它们是否重叠。数组的大小(比如m)可以用O(n)来确定,但空间和时间要求是O(m)。