while循环的时间复杂度

时间:2013-11-23 18:22:51

标签: python algorithm loops while-loop time-complexity

如果我理解时间复杂度的计算,我根本不确定。我得到了这些循环,这些是我的计算。但是,我不确定在这里对大O有什么说法。

循环1:

lst = []                   
i=1                        
while i<n:
  lst = list(range(i))       
  i *= 2 

我假设每个操作花费O(1)时间。在该循环中,第1行和第2行分别执行1次。 while循环的第一行有3个操作 - 范围,列表和该值到lst的赋值。由于我们处理范围,我认为它运行n + 1次。

循环的最后一行有2个操作:乘以2并将该值赋给i,它运行n次。

由此,我认为总数将是: 1 + 1 + 3(n + 1)+ 2n = 5n + 5。

由于这是一个线性函数,那么大O将是O(n)?

===============

循环2:

lst = []            
i=1                 
while i<n:
  lst = lst + [i]      
  i *= 2    

这里我们有类似的情况,但是while循环的第一行有2个操作。 然后,
1 + 1 + 2n + 2n = 4n + 2.

因为它是线性函数,所以它也是O(n)?

========================== 循环3:

lst = []          
i=1                
while i<n:
  lst += [i]         
  i *= 2  

我认为lst + = [i]将执行2次2次操作,因为这是就地计算?我不确定这一点。如果这是对的,那么总数就是 6N + 2

问题是:我计算这些是对还是我完全错了?如何为每个循环编写大O?

1 个答案:

答案 0 :(得分:0)

LOOP 1:O(n log n)

循环运行log2(n)次,其平均值为O(log n)。每次迭代都会(最坏的情况下)执行n次操作。所以复杂性是O(n log n)。

LOOP 2:O(log n)

循环运行log2(n)次,其平均值为O(log n)。 我想赋值lst = lst + [i]只是添加节点(而不是新列表)。它的平均值为O(1),因此复杂度为O(log n)。 如果我错了,则赋值会创建新列表,因此每次迭代都会执行(最坏情况下)n次操作。所以复杂性是 O(n log n)

LOOP 3:O(log n)

与循环2一样。这里,赋值是O(1)肯定,而不是假设......