for (int i = 0; i < n; i++)
{
for (int j = 0; j < i*i; j++)
{
cout << j << endl;
result++;
}
}
运行此代码说5,它总共运行30次。我知道外循环运行N.内循环虽然给了我一些麻烦,因为它不是n*n
而是i*i
而我在尝试找出T(n)
之前没有看到过这样的问题和Big(O)。
答案 0 :(得分:0)
此算法为O(n^3)
:要实现这一点,我们必须弄清楚内部代码的频率
cout << j << endl;
result++;
已执行。为此,我们需要总结1*1+2*2+...+n*n = n^3/3+n^2/2+n/6
这是一个众所周知的结果(参见例如Sum of the Squares of the First n Natural Numbers)。因此,O(T(n)) = O(1*1+2*2+...+n*n) = O(n^3)
和算法的(时间)复杂度因此O(n^3)
。
修改:如果您想知道为什么这样就足够了(另请参阅Time complexity with examples中的示例4),将代码重写为单个循环是有帮助的,这样我们就可以看到循环添加了一定量的指令(对于内部代码的每次运行):
int i = 0;
int j = 0;
while(i < n) {
cout << j << endl;
result++;
if(j < i * i) j++; //were still in the inner loop
else {//start the next iteration of the outer loop
j = 0;
i++;
}
}
因此,这两个循环“添加”。两个比较加上if语句,它简单地使条件跳转及其效果更明确。