搜索间隔列表的时间复杂度

时间:2017-06-29 00:51:06

标签: algorithm search time-complexity

a区间 [a.start, a.end],其中a.starta.end是实数,0 <= a.start < a.end <= 1

如果ab

,则两个此类时间间隔a.start < b.start < a.endb.start <= a.start < b.end 相交

As成为非交叉区间a_0, a_1, ..., a_n的排序列表,以使a_ia_ja_i.start < a_j.start不相交i < j 1}}

给定间隔b,确定Asb相交(或找不到交叉点)的第一个间隔和最后一个间隔。即:如果可能,找到ij,使b与a_ia_j相交,但不与a_{i-1}a_{j+1}

相交

我用改进的二进制搜索(在最坏的情况下为O(n))解决了这个问题,所以我的直觉是这是一个lg(n)问题,但我不知道我是不是有最好的算法。

1 个答案:

答案 0 :(得分:1)

因为您有一个非交叉区间的排序列表,您知道每个区间在下一个区间开始之前结束,您也可以将此列表视为区间起点的排序列表,或间隔终点的排序列表

我认为你可以在一个间隔终点的排序列表上使用二进制搜索来找到最小的间隔终点,该终点在O(log n)最坏情况时间内至少与b.start一样大,这是第一个与b相交的区间(如果任何区间与b相交)。类似地,如果任何间隔与b相交,则与b相交的最后一个间隔的最大起点不大于b.end。

要找到至少与目标一样大的最小点,请查看可能解决方案范围中间的点(按可能解决方案的数量,而不是按位置)。如果此点至少与目标一样大,则可能解决方案的范围从该点延伸到左侧,并包括该点。如果这一点不至少与目标一样大,则可能解决方案的范围从该点之后延伸到右侧。在任何一种情况下,您已将可能的解决方案数量减少了大约一半,因此您的最坏情况为O(log n)。