问题1
for (i = 0; i < n; i++) {
for (j = 0; j < i * i ; j++){
}
}
Answer: O(n^3)
乍看之下,O(n ^ 3)对我来说很有意义,但我记得我以前做过的一个问题:
问题2
for (int i = n; i > 0; i /= 2) {
for (int j = 0; j < i; j++) {
//statement
}
}
Answer: O(n)
对于问题2,外循环为O(log n),内循环为O(2n / log n),得出O(n)。内部循环为O(2n / log n),因为-参见此处的说明:Big O of Nested Loop (int j = 0; j < i; j++)
为什么我们不像问题2那样做问题1,因为在问题1中,j
也取决于i
,这意味着我们实际上应该取内部迭代次数的平均值。循环(就像我们在问题2中一样)。
我的答案是:外循环为O(n),内循环为O(n ^ 2 / n),这导致问题1的O(n ^ 2)。
答案 0 :(得分:2)
您的回答是错误的。代码是Θ(n³)
。
要注意的是,内部循环最多执行i²
个n²
步骤,但对于外部循环来说,迭代的一半至少为(n/2)² = n²/4
。
因此,内部迭代的总数最多为n * n² = n³
,但至少为n/2 * n²/4 = n³/8
。
您的考虑是错误的,因为内部循环平均与n²
多次迭代成正比,而不是n² / n
。
答案 1 :(得分:1)
内部for
循环与外部for
循环一起正在执行的操作是计算i^2
的总和。如果写出来,您将添加以下术语:
1 + 4 + 9 + 16 + ...
The result of that是(2n^3+3n^2+n)/6
。如果要计算内部for
循环的迭代次数的平均值,则将其除以n
,因为这是外部for
循环的迭代数。因此,按照Big O表示法,您将得到(2n^2+3n+1)/6
。有了它,您什么都没有。您尚未获得任何新信息,因为您已经知道内部O(n^2)
循环的复杂性为for
。 O(n^2)
运行O(n^2)
次使您n
的总体复杂性,您已经知道...
因此,您可以计算内部O(n^3)
循环的平均值迭代次数,但不会获得任何新信息。重复步骤的数量没有您上一个问题(for
的内容)减少。
答案 2 :(得分:0)
void fun(int n, int k)
{
for (int i=1; i<=n; i++)
{
int p = pow(i, k);
for (int j=1; j<=p; j++)
{
// Some O(1) work
}
}
}
上述功能的时间复杂度可以写为1k + 2k + 3k +…n1k。
在您的情况下,k = 2
Sum = 12 + 22 + 32 + ... n12.
= n(n+1)(2n+1)/6
= n3/3 + n2/2 + n/6