问题是要找到小于或等于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))中找到索引?
答案 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个索引。(start + end)/2 = floor((start + end)/2)
,这很明显。一旦达到[{1}}的差异,就可以检查顶部和底部是否满足(n + n + 1)/2 = (2n + 1)/2 => 2n/2 = n
的要求。
未处理完全清空的清单案例。