让a
为区间 [a.start, a.end]
,其中a.start
和a.end
是实数,0 <= a.start < a.end <= 1
。
如果a
或b
a.start < b.start < a.end
和b.start <= a.start < b.end
相交
让As
成为非交叉区间a_0, a_1, ..., a_n
的排序列表,以使a_i
与a_j
和a_i.start < a_j.start
不相交i < j
1}}
给定间隔b
,确定As
中b
相交(或找不到交叉点)的第一个间隔和最后一个间隔。即:如果可能,找到i
和j
,使b与a_i
和a_j
相交,但不与a_{i-1}
或a_{j+1}
我用改进的二进制搜索(在最坏的情况下为O(n))解决了这个问题,所以我的直觉是这是一个lg(n)问题,但我不知道我是不是有最好的算法。
答案 0 :(得分:1)
因为您有一个非交叉区间的排序列表,您知道每个区间在下一个区间开始之前结束,您也可以将此列表视为区间起点的排序列表,或间隔终点的排序列表
我认为你可以在一个间隔终点的排序列表上使用二进制搜索来找到最小的间隔终点,该终点在O(log n)最坏情况时间内至少与b.start一样大,这是第一个与b相交的区间(如果任何区间与b相交)。类似地,如果任何间隔与b相交,则与b相交的最后一个间隔的最大起点不大于b.end。
要找到至少与目标一样大的最小点,请查看可能解决方案范围中间的点(按可能解决方案的数量,而不是按位置)。如果此点至少与目标一样大,则可能解决方案的范围从该点延伸到左侧,并包括该点。如果这一点不至少与目标一样大,则可能解决方案的范围从该点之后延伸到右侧。在任何一种情况下,您已将可能的解决方案数量减少了大约一半,因此您的最坏情况为O(log n)。