找到所有区间[s,e],其中s,e在N_0和s <1中。 e与另一给定间隔重叠

时间:2013-09-14 16:45:39

标签: algorithm sorting processing-efficiency

我有一个算法问题,我想看看它是否可以比O(n)更好地解决:

我给出了一个n个元素的表T,其中每个元素是一个元组(s_i,e_i),其中s_i,e_i在N和s_i&lt; e_i,即每个元组是某种间隔。我必须找到与给定间隔[t0,t1]重叠的所有间隔,其中t0,t1为N,t0

问题:

我们必须找到T中的每个间隔/元组(s_i,e_i),其中s_i&lt; = t1和e_i&gt; = t0。

到目前为止我的想法:

我们可以通过应用其中一个区间边界来排除某些元素,即在S中搜索t1或在E中搜索t0。这为我们提供了剩余元素的列表L:

L <- {e in E | e >= t0} or L <- {s in S | s <= t1}

但是,无论我们执行哪种搜索,L中的元素数量都没有下限。此外,我们必须检查L中的每个元素,如果s&lt; = t1,或e&gt; = t0,则取决于我们之前执行的搜索。

此解决方案的复杂性为O(n)。

但是,假设k是与区间[t0,t1]重叠的元素的最大数量。如果我们假设k <&lt;&lt; n,那么复杂度是O(n / 2),因为我们可以通过选择适当的L搜索来排除至少n / 2个元素。仍然O(n / 2)在O(n)中。

你能想出一个更好的方法来解决这个问题吗?

(请随意改进这个问题。也许它不是很清楚。谢谢)

2 个答案:

答案 0 :(得分:2)

如果您对k(答案中的间隔数量)一无所知,则不能超过O(N),因为结果中可能有N个间隔。

如果你知道k比N小很多,你可能会做得更好。使用二进制搜索,您可以找到s_i<t0的最后一个i0和s_i1>t1的第一个i1。

然后你找到e_j0<t0的最后一个j0和e_j1>t1的第一个j1。

结果在max(i0,j0)和min(i1,j1)之间。所以你有O(logN)+ O(k)。

答案 1 :(得分:0)

解决方案可以在cs.stackexchange.com找到:一般问题不能在小于O(n)的情况下解决。 Interval trees为搜索与某个其他区间重叠的区间提供O(log n)+ O(k)复杂度,假设k是重叠区间的数量。