Skip to main content
 首页 » 编程设计

python之一个循环的时间复杂度

2025年05月04日14birdshome

foo = [] 
i = 1 
while i < n: 
    foo= foo + ["a"] 
    i*=2 

这段代码的时间复杂度是多少?
我的想法是: while 循环执行 log(n) 迭代。每次迭代都会创建新列表。
因此,总时间复杂度为:O(log^2(n))。

我说得对吗?

请您参考如下方法:

while 循环迭代 log(n) 次。

foo + ["a"]:通过复制原始列表创建一个新列表。根据Time Complexity - Python Wiki ,复制一个列表需要 O(n)。

时间复杂度 => 1 + 2 + 3 + ... + 日志(n) => (log(n) + 1) * log(n)/2 => O(log2n)


我运行了一个timeit:(CPython 2.7.5 64 位,Windows 7)

def f(n): 
    foo = [] 
    i = 1 
    while i < n: 
        foo = foo + ["a"] 
        i *= 2 
 
import timeit 
for n in range(20): 
    print n, timeit.timeit('f({})'.format(2 ** n), 'from __main__ import f') 

结果:

2**0 0.187083903003 
2**1 0.455513095565 
2**2 0.690063737582 
2**3 0.925251130713 
2**4 1.16173567555 
2**5 1.38232866174 
2**6 1.64922777752 
2**7 1.89248633685 
2**8 2.14087549485 
2**9 2.36934465058 
2**10 2.62737119511 
2**11 2.91843160213 
2**12 3.19988987374 
2**13 3.43422677799 
2**14 3.72119850214 
2**15 4.00189195846 
2**16 4.31630377356 
2**17 4.62789416099 
2**18 4.91062905834 
2**19 5.24480246883