我有一个算法问题,我想看看它是否可以比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中的元素数量都没有下限。此外,我们必须检查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)中。 你能想出一个更好的方法来解决这个问题吗? (请随意改进这个问题。也许它不是很清楚。谢谢)L <- {e in E | e >= t0} or L <- {s in S | s <= t1}
答案 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是重叠区间的数量。