各种版本的二进制搜索的大O.

时间:2013-09-10 16:07:46

标签: algorithm big-o

我获得了以下代码,被告知要以大写法表示最佳和最差情况下的运行时间。

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值

1 个答案:

答案 0 :(得分:1)

让我们说,在最坏的情况下,我们正在搜索N个元素数组中最后一个元素。

第一次迭代后,列表将减少到2N / 3。

第二次迭代后,列表将减少到4N / 9

。 。

在第(k-1)次迭代之后,列表将减少为2个元素

经过第k次迭代后,我们终于找到了我们的候选人。

因此N *(幂(2/3,k))= 1。

k~log(N)到1.5的基础