在python中实现修改的二进制搜索

时间:2014-11-25 09:47:22

标签: python algorithm binary-search

问题是要找到小于或等于N的元素的索引。为了解决这个问题,我写了下面的代码,但似乎没有用。

def find_index(primes, N, start, end):
    mid = int((start + end)/2)
    if start == end:
    return start

    if primes[mid - 1] < N: 
        if primes[mid] == N:
            return mid
        elif primes[mid] > N:
            return mid - 1
        else:
            return find_index(primes, N, start, mid + 1)
    elif primes[mid - 1] > N:
        if primes[mid] > N:
            return find_index(primes, N, mid - 1, end)

我错过了什么明显的情况?有没有更好的方法在O(log(n))中找到索引?

1 个答案:

答案 0 :(得分:0)

如果你有一个大小为2或更大的列表,则分而治之:

def find_index(primes, N, start, end):
    mid = int((start + end)/2)

    if start == end:
        return start

    if end - start == 1:
        return end if primes[end] < N else start

    if primes[mid] == N:
      return mid
    elif primes[mid] < N:
        return find_index(primes, N, mid, end)
    else:
        return find_index(primes, N, start, mid)

这里的逻辑是通过中点选择子列表最终会产生start的{​​{1}}和end之间的差异。可以假设这是由于以下原因:

  1. 1起,中点最终将远离上边界1个索引。
  2. 大小为2的列表(例如,开始/结束3/4或2/3)将始终产生大小为2的列表,因为中点将是下限。鉴于(start + end)/2 = floor((start + end)/2),这很明显。
  3. 一旦达到[{1}}的差异,就可以检查顶部和底部是否满足(n + n + 1)/2 = (2n + 1)/2 => 2n/2 = n的要求。

    未处理完全清空的清单案例。