Python 循环的时间复杂度 foo=[] i=1 而i 1 + 2 + 3 + ... + 日志(n) =>(对数(n)+1)*对数(n)/2 =>O(log2n)
此代码的时间复杂度是多少?Python 循环的时间复杂度 foo=[] i=1 而i 1 + 2 + 3 + ... + 日志(n) =>(对数(n)+1)*对数(n)/2 =>O(log2n),python,complexity-theory,time-complexity,Python,Complexity Theory,Time Complexity,此代码的时间复杂度是多少? 我的想法是: while循环记录(n)次迭代。每次迭代都会创建新列表。 因此,总时间复杂度为:O(log^2(n)) 我说得对吗?循环会记录(n)次迭代 现在,假设foo=foo+[“a”]立即复制foo中的每个元素以进行连接(与一些奇特的列表附加相反),那么对于每个迭代,最多也有log(n)副本 是的,它是log(n)*log(n)=log^2(n)循环记录(n)次迭代 现在,假设foo=foo+[“a”]立即复制foo中的每个元素以进行连接(与一些奇特的列表附加相
我的想法是: while循环记录(n)次迭代。每次迭代都会创建新列表。
因此,总时间复杂度为:O(log^2(n)) 我说得对吗?循环会记录(n)次迭代 现在,假设
foo=foo+[“a”]
立即复制foo
中的每个元素以进行连接(与一些奇特的列表附加相反),那么对于每个迭代,最多也有log(n)
副本
是的,它是log(n)*log(n)
=log^2(n)
循环记录(n)次迭代
现在,假设foo=foo+[“a”]
立即复制foo
中的每个元素以进行连接(与一些奇特的列表附加相反),那么对于每个迭代,最多也有log(n)
副本
因此,是的,它是
log(n)*log(n)
=log^2(n)
循环迭代log(n)次时的
foo+[“a”]
:通过复制原始列表创建新列表。根据,复制列表需要O(n)
时间复杂性
=> 1 + 2 + 3 + ... + 日志(n)
=>(对数(n)+1)*对数(n)/2
=>O(log2n)
我运行了一个timeit
:(CPython 2.7.5 64位,Windows 7)
while循环迭代日志(n)次
foo+[“a”]
:通过复制原始列表创建新列表。根据,复制列表需要O(n)
时间复杂性
=> 1 + 2 + 3 + ... + 日志(n)
=>(对数(n)+1)*对数(n)/2
=>O(log2n)
我运行了一个timeit
:(CPython 2.7.5 64位,Windows 7)
假设循环迭代n次而不是log(n)次,那么数组拷贝需要0+1+2+3+4+…+n-2次操作;用n+2,它需要
0+1+2+3+4+…+n=1/2·n·(n+1)
行动。为了简单起见,让我们用m替换n+2,因此n+2=m,因此n=m-2,并且
1/2·n·(n+1)=1/2·(m-2)·(m-2+1)=1/2·(m-2)·(m-1)
我们将在稍后用作
f(m)=1/2·(m-2)·(m-1)
现在,由于循环的限制不是n+2而是log(n),所以没有
f(n+2)=1/2·((n+2)-2)·((n+2)-1)=1/2·n·(n+1)(见上述发散级数)
但是
f(对数(n))=1/2·(对数(n)-2)·(对数(n)-1)
操作,即
1/2·(对数2(n)-3·对数(n)+2)∈ ⑩(log2(n))。■
让我们假设循环迭代n次而不是log(n)次,那么数组拷贝需要0+1+2+3+4+…+n-2次操作;用n+2,它需要
0+1+2+3+4+…+n=1/2·n·(n+1)
行动。为了简单起见,让我们用m替换n+2,因此n+2=m,因此n=m-2,并且
1/2·n·(n+1)=1/2·(m-2)·(m-2+1)=1/2·(m-2)·(m-1)
我们将在稍后用作
f(m)=1/2·(m-2)·(m-1)
现在,由于循环的限制不是n+2而是log(n),所以没有
f(n+2)=1/2·((n+2)-2)·((n+2)-1)=1/2·n·(n+1)(见上述发散级数)
但是
f(对数(n))=1/2·(对数(n)-2)·(对数(n)-1)
操作,即
1/2·(对数2(n)-3·对数(n)+2)∈ ⑩(log2(n))。■
请参阅将两个列表的副本复制到一个新列表中,它不会以任何方式修改原始实例。+
将两个列表的副本复制到一个新列表中,它不会以任何方式修改原始实例。-1这与时间复杂性有关,而与某些测试机器上的实际运行时间无关。这个问题不用计算机也能回答。@Gumbo,编辑答案以增加时间复杂性。-1这是关于时间复杂性,而不是关于某些测试机器上的实际运行时间。这个问题不用电脑也能回答。@Gumbo,编辑答案以增加时间复杂性。离题:您是如何处理的?:)(向上滚动查看上下文)@Pekka웃 嗯,那么我到底在看什么呢?这是一个堆栈溢出用户群的三维渲染,使用声誉:渲染中的“塔”有一个异常,周围有空的空间(出于某种数学原因),这使它看起来像一个地堑。没有什么特别的,只是我觉得很有趣。离题:你是怎么做到的?:)(向上滚动查看上下文)@Pekka웃 嗯,那么我到底在看什么呢?这是一个堆栈溢出用户群的三维渲染,使用声誉:渲染中的“塔”有一个异常,周围有空的空间(出于某种数学原因),这使它看起来像一个地堑。没有什么特别的,只是我觉得很有趣。
foo = []
i = 1
while i < n:
foo= foo + ["a"]
i*=2
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