一个while循环的整体Big-O复杂性,内部步骤随着每个循环而增加

时间:2017-01-02 01:57:44

标签: algorithm time-complexity big-o asymptotic-complexity

我开始学习复杂性分析,我无法弄清楚这部分算法的整体Big-O复杂性,应该如何计算?

Code Fragment               Time Complexity
1 -  C = 0                  O(1)
2 -  while C <= L           O(L)
3 -      f(C += 1)          O(???)

第3步实际上需要更多步骤,但可以概括为执行C步骤的函数f。

我的问题是每次迭代都会增加C,所以任何帮助或方向都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

如果f(C)步数增加C步,C每次迭代增加L,则算法为O(L^2)

答案 1 :(得分:1)

让我们在那里插入一些数字,看看会发生什么。

  • 对于L = 0,步骤3以0步运行一次;
  • 对于L = 1,步骤3用0运行两次,然后是1步;
  • 对于L = 2,步骤3以0,1和2步运行3次;
  • 对于L = 3,步骤3以0,1,2和3步运行4次;
    [...]
  • 对于L = C,步骤3运行n次,0,1,...和C = L步。

假设“零步”是恒定时间并将其更改为1.所以有两种方法可以回答这个问题:

  • 您的功能运行1 + 1 + 2 + 3 + .. + L步。那是1 +一系列L元素,总和为1 + L * (L + 1) / 2,所以它是O(L 2 );
  • 它运行L次可以限制为O(L)的函数,所以它是O(L 2 )。

答案 2 :(得分:0)

如果函数f() DOESN&#39; T 改变C ...则显示的三条线的总体复杂度为O(N):时间将随着大小而线性增加L - C增长。第1行和第3行都没有贡献:它们基本上都是&#34;常数&#34;。

如果函数f() DOES 改变C(例如使用全局变量),则第2行和第3行都有贡献,而cjungel&#39; s和giusti的答案是正确的{ {1}}。

这是一篇很棒的文章:

https://justin.abrah.ms/computer-science/how-to-calculate-big-o.html