计算时间复杂度为O(log n)的值的出现次数

时间:2013-11-22 20:42:05

标签: python time-complexity

给定排序列表L的整数(开头的最低值),不同彼此,返回L [i] == i for i> ; = 0

>>> count_occur([-5,-2,0,3,8])
1
>>> count_occur([-5,-2,2,3,8])
2
>>> count_occur([-5,-2,0,4,8])
0

问题是我应该在最坏情况上以时间复杂度O(logn)实现它。

我可以在O(logn)on和平均情况下实现它,但显然它不够好。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

L[i] == i只能对i的连续值范围内为true。 (你能明白为什么吗?)因此,我们可以通过二进制搜索L[i] - i == 0的最左边和最右边的值,在O(log(n))最坏情况下解决这个问题。

使用bisect模块进行二进制搜索:

import bisect

class HelperList(object):
    """Lazily computes l[i] - i to determine values."""
    def __init__(self, l):
        super(HelperList, self).__init__()
        self.l = l
    def __len__(self):
        return len(self.l)
    def __getitem__(self, i):
        return self.l[i] - i

def count_occur(l):
    helperlist = HelperList(l)
    leftmost = bisect.bisect_left(helperlist, 0)
    if l[leftmost] != leftmost:
        return 0
    return bisect.bisect_right(helperlist, 0) - leftmost