为 for 循环确定不同的大 O 复杂度
Posted
技术标签:
【中文标题】为 for 循环确定不同的大 O 复杂度【英文标题】:determining different big O complexity for for loops 【发布时间】:2020-01-16 03:06:53 【问题描述】://outer for loop runs at most n times
for (int w = 1; w < n; w++)
// inner for loop at most log(73550/n) times
for (int y = w; y < 73550; y = y * 2)
x = x + w;
k = k * w;
我真的很困惑第二个循环是否会增加大 O 时间复杂度,因为它有一个设置的最大迭代?大 O 会是 O(n)、O(nlog(1/n)) 还是两者都不是??
int p = 0;
int q = 0;
//runs at most 18n^2 times
while (p < 18 * n * n)
if (p % 2 == 0)
q++;
p++;
//p = 18n^2 q1 = 9n^2
//runs at most log(9n^2) times
for (int r = 1; r < q; r = r * 3)
q++;
return p * q;
像这样的顺序函数的时间复杂度只是更大的时间复杂度吧?所以它将是 O(n^2) ?
//runs at most n(4n-1) times
for (int k = 2; k <= 2n(4n-1); k+=2)
j++;
即使是 -1,时间复杂度也会是 O(n^2) 对吧?
【问题讨论】:
我们不是认为定义复杂度的输入数据集最差吗? 这些循环会终止吗? 是的,值 n 只是传递给函数的一些整数值。 @MitchelPaulin 【参考方案1】:第一种情况:O(n)
,因为正如您所说,循环迭代的次数是恒定的。在循环边界上具有非常大的常数并不典型,因此在大多数自然算法中这并不是什么大问题。如果 73550 实际上是一个非常量变量,但与 n 无关,我们可以给它一个名称(例如 m),并说复杂度是 O(n*log(m))
。
第二种情况:是的,O(n^2)
,因为你给的原因。
第三种情况:是的,O(n^2)
。首先,big-O 只提供了一个上限,因此 -1 只会更容易保证上界。其次,即使你的意思是Ө(n^2)
,它仍然是,因为n(4n-1) = 4n^2-n
,对于某些常数k
,它渐近大于k*n^2
。在这种情况下,任何小于 4 的k
。
【讨论】:
感谢您的帮助和澄清。它有很大帮助:)以上是关于为 for 循环确定不同的大 O 复杂度的主要内容,如果未能解决你的问题,请参考以下文章