找到函数的复杂性

时间:2015-05-22 19:21:25

标签: python max time-complexity complexity-theory

我正在尝试计算下一个函数max_list11的时间复杂度,该函数以递归方式查找列表的最大值:

def max11(L,left,right):
    if left==right:
        return L[left]
    return max(L[left], max11(L,left+1,right))

def max_list11(L):
    return max11(L,0,len(L)-1)

根据我的发现,时间复杂度应为O(n),因为函数所做的是n次最多2个对象列表,尽管当我计算运行时间时,我得到多项式增长运行时间(显然是O(n²)),我想知道为什么会这样。

我以这种方式完成这项工作:

def elasped(f,L):
    t0 = time.clock()
    s = f(L)
    return(time.clock()-t0)

def avg_elasped(f,L,times = 100):
    measurements = []
    for i in range(times):
        measurements += [elasped(f,L)]
    return sum(measurements)/times

然后我尝试了1000,2000,....,10000长列表。

2 个答案:

答案 0 :(得分:0)

递归方法将每次调用的输入大小减少一个,因此它在理论上是线性的(因为您基本上是对最大值进行线性搜索)。 Python列表的实现将扭曲基于计时器的分析。

答案 1 :(得分:0)

是线性的:

%timeit max_list11(range(10))
100000 loops, best of 3: 6.93 µs per loop

%timeit max_list11(range(100))
10000 loops, best of 3: 66.7 µs per loop

%timeit max_list11(range(1000))
1000 loops, best of 3: 775 µs per loop

%timeit max_list11(range(10000))
100 loops, best of 3: 9.82 ms per loop

始终使用timeit.default_timer()作为时间戳。或者像我为这个输出做的那样IPython。 time.clock()具有不同的含义,具体取决于您的操作系统。来自docs

  

在Unix上,将当前处理器时间返回为以秒为单位的浮点数。精确度,实际上是“处理器时间”含义的定义,取决于同名C函数的精度。

     

在Windows上,此函数返回自第一次调用此函数以来经过的挂钟秒,作为浮点数,基于Win32函数QueryPerformanceCounter()。分辨率通常优于1微秒。