假设间隔列表可以是[[1,3],[2,4],[6,12]],并且查询时间T =3。上面列表中具有3的间隔数是2 (即)[[1,3],[2,4]]。可以在O(logn)时间执行此操作吗?
答案 0 :(得分:2)
通常情况下,这无法在O(log n)时间内完成。
您可以在开始时间进行二进制搜索,以查找可能包含查询时间的最后一个间隔,但是由于在结束时间上没有隐含的顺序,因此您从列表的开始到所标识的项目进行了顺序搜索作为最后一个确定查询时间是否在那些间隔中的时间。
请考虑使用[(1,7),(2,11),(3,8),(4,5),(6,10),(7,9)]
,查询时间为7。
在开始时间进行二进制搜索将告诉您所有时间间隔都可以包含查询时间。但是,由于结束时间没有特定顺序,因此您无法对它们进行二进制搜索。您必须查看每个单独的时间间隔以确定结束时间是否大于或等于查询时间。在这里,您看到(4,5)
不包含查询时间。
答案 1 :(得分:0)
要注意的一件事是,对于一个包含T的间隔,其开始时间必须小于或等于T。由于这些时间是按开始时间排序的,因此您可以使用基本的二进制搜索来消除所有这些在O(log n)时间开始太晚了。
如果我们可以假设它们也按结束时间排序-也就是说,没有一个间隔完全包含先前的间隔-那么您可以使用另一种二进制搜索来消除所有结束时间早于T的那些。将运行时间保持在O(log n)。
如果我们不能做出这样的假设,事情就会变得更加复杂,而且我想不出任何比O(n log n)更好的方法[通过按结束时间对其余列表进行排序并执行另一个二进制搜索在那]。也许有办法吗?
编辑正如Qbyte在下面说的那样,最后的排序是多余的;您可以通过对其余集合进行简单的线性搜索将其降至O(n)。再说一次,如果您仍要使用O(n)解决方案,则最好跳过整个算法,而只对原始集合进行线性搜索。
答案 2 :(得分:0)
让我们假设间隔是按开始时间排序的。二进制搜索 O(log n)将消除不包含 T 的时间间隔。其余的可能。
您必须扫描其余的 O(n)并对其进行计数。总复杂度 O(n)。鉴于此,您也可能从未进行过二进制搜索,而只是扫描了整个列表。
如果其余的也按结束时间排序,则可以进行另一次二进制搜索,将复杂度保持在 O(log n)。
但是您还没有完成。您需要计数。
您知道计数的开始。如果没有,则无法进行二进制搜索。您将知道每个二进制搜索的最后一个测试的索引。这是一个 O(1)计算选项。
因此,此选项的总复杂度为 O(log n)。