Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环的时间复杂度 foo=[] i=1 而i 1 + 2 + 3 + ... + 日志(n) =>(对数(n)+1)*对数(n)/2 =>O(log2n)_Python_Complexity Theory_Time Complexity - Fatal编程技术网

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