我获得了以下代码,被告知要以大写法表示最佳和最差情况下的运行时间。
def find(a, target):
x = 0
y = len(a)
while x < y:
m = (x+y)/2
if a[m] < target:
x = m+1
elif a[m] > target:
y = m
else:
return m
return -1
我知道在最坏的情况下这段代码的运行时间是O(lg(n))。但是,如果第五行从“m =(x + y)/ 2”变为“m =(2 * x + y)/ 3”,我会得到的问题是运行时间会改变吗?
我的直觉是,运行时间变得有点大,因为它不再像二进制搜索一样将列表切成两半,效率会降低,但我不知道如何计算此时的大O值
答案 0 :(得分:1)
让我们说,在最坏的情况下,我们正在搜索N个元素数组中最后一个元素。
第一次迭代后,列表将减少到2N / 3。
第二次迭代后,列表将减少到4N / 9
。 。
在第(k-1)次迭代之后,列表将减少为2个元素
经过第k次迭代后,我们终于找到了我们的候选人。
因此N *(幂(2/3,k))= 1。
k~log(N)到1.5的基础