while 循环的总体 Big-O 复杂度,内部步骤随着每个循环而增加
Overall Big-O complexity of a while loop, with inner step that increases with every loop
刚开始学习复杂度分析,搞不懂这部分算法整体的Big-O复杂度,这个应该怎么计算?
Code Fragment Time Complexity
1 - C = 0 O(1)
2 - while C <= L O(L)
3 - f(C += 1) O(???)
步骤3其实需要更多的步骤,但可以概括为一个函数f执行了C步
我的问题是每次迭代都会增加 C,因此我们将不胜感激任何帮助或指导。
如果 f(C)
采取 C
步并且 C
在每次迭代中增加到值 L
那么算法是 O(L^2)
.
让我们在其中插入一些数字,看看会发生什么。
- 对于L=0,第3步运行一次0步;
- 对于L=1,第3步运行两次0,然后1步;
- 对于L=2,第3步运行3次0、1、2步;
- 对于L=3,第3步运行4次,分别为0、1、2、3步;
[...]
- 对于 L=C,步骤 3 使用 0、1、... 和 C=L 步骤运行 n 次。
假设"zero steps"是常数时间,把它改成1。所以有两种方法可以回答这个问题:
- 您的函数运行 1+1+2+3+..+L 步。那是 1 + 一系列 L 元素,总和为
1 + L * (L + 1) / 2
,所以它是 O(L2);
- 它运行 L 次可以限制为 O(L) 的函数,所以它是 O(L2).
如果 function f() DOESN'T change C ... 那么你展示的三行的整体复杂度是 O(N):时间将线性增加L - C
的大小增加了。第 1 行和第 3 行都没有贡献:它们本质上都是 "constant".
如果函数 f() 确实 改变了 C(例如使用全局变量),那么第 2 行和第 3 行都有贡献,cjungel 和 giusti 的答案是正确的O(L^2)
.
这是一篇很棒的文章:
https://justin.abrah.ms/computer-science/how-to-calculate-big-o.html
刚开始学习复杂度分析,搞不懂这部分算法整体的Big-O复杂度,这个应该怎么计算?
Code Fragment Time Complexity
1 - C = 0 O(1)
2 - while C <= L O(L)
3 - f(C += 1) O(???)
步骤3其实需要更多的步骤,但可以概括为一个函数f执行了C步
我的问题是每次迭代都会增加 C,因此我们将不胜感激任何帮助或指导。
如果 f(C)
采取 C
步并且 C
在每次迭代中增加到值 L
那么算法是 O(L^2)
.
让我们在其中插入一些数字,看看会发生什么。
- 对于L=0,第3步运行一次0步;
- 对于L=1,第3步运行两次0,然后1步;
- 对于L=2,第3步运行3次0、1、2步;
- 对于L=3,第3步运行4次,分别为0、1、2、3步;
[...] - 对于 L=C,步骤 3 使用 0、1、... 和 C=L 步骤运行 n 次。
假设"zero steps"是常数时间,把它改成1。所以有两种方法可以回答这个问题:
- 您的函数运行 1+1+2+3+..+L 步。那是 1 + 一系列 L 元素,总和为
1 + L * (L + 1) / 2
,所以它是 O(L2); - 它运行 L 次可以限制为 O(L) 的函数,所以它是 O(L2).
如果 function f() DOESN'T change C ... 那么你展示的三行的整体复杂度是 O(N):时间将线性增加L - C
的大小增加了。第 1 行和第 3 行都没有贡献:它们本质上都是 "constant".
如果函数 f() 确实 改变了 C(例如使用全局变量),那么第 2 行和第 3 行都有贡献,cjungel 和 giusti 的答案是正确的O(L^2)
.
这是一篇很棒的文章:
https://justin.abrah.ms/computer-science/how-to-calculate-big-o.html