python - while 循环的时间复杂度

标签 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] 会执行 2n 次 2 次操作,因为这是就地计算?我不确定这一点。如果这是正确的,那么总数将是 6n+2

问题是:我的计算是正确的还是完全错误的?如何为每个循环编写大 O?

最佳答案

循环 1:O(n log n)

循环运行 log2(n) 次,平均 O(log n)。每次迭代(在最坏的情况下)执行 n 个操作。所以复杂度是 O(n log n)。

循环 2:O(log n)

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

循环 3:O(log n)

在循环 2 中,这里的赋值肯定是 O(1),而不是假设...

关于python - while 循环的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20166107/

相关文章:

python - 无法在下面的 python 代码中进行插入排序工作

python - 如何将这个简单的 5 个字节变回 4 个字节? (将 4 个字节转换为 5 个字节的算法是已知的)

c++ - 在 C++ 中获取中间值

c - 作为指针的参数未正确递增

java - 我怎样才能完成这个 stateQuiz.java 程序

loops - 在 Makefile 中循环 ifndef/endif 结构

python - 在哪里使用带循环的 return 语句?

python - 使用 Cartopy 绘制极地网格海冰浓度

python - 如何停止/终止Python脚本的运行? (再次)

python - 如何在 python 中使用 nosetests 同时传递/接受 argparse 的参数?