for(i=0; i<n; i++)
{
a[i]=0;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
a=3;
}
}
}
这是一个三重嵌套循环。我的书指出,运行时间是: O(N)+ O(N ^ 2)= O(N ^ 2)
不应该是O(N ^ 3)吗?所有3个循环都相互依赖。它将运行N * N * N次。
答案 0 :(得分:6)
这是因为循环#1
和循环#2
在比较期间使用相同的计数变量i
。
在使用i
的第二个循环结束时,i
的值为 n ,这使得它也会脱离外部循环。 那里的一个循环完全是多余的。
#include <stdio.h>
int main(){
int x = 0;
int n = 20;
int i, j;
for(i=0; i<n; i++) //this loop runs once
{
for(i=0; i<n; i++) //this loop runs n times
{
for(j=0; j<n; j++) //this loop also runs n times
{
x++;
}
}
}
printf("%d", x);
}
整个正在运行O(N^2)
时间。
<强> Example 强>
答案 1 :(得分:1)
我不认为这是你书中的错误。你必须更深入地看待你的代码: 两个第一个循环对循环使用相同的变量,因此会发生以下情况:
在第一个括号后,i等于0,然后进入第二个循环。当第二个循环结束时,第一个循环将结束,因为两个循环都使用条件i
实际上我没有看到O(N)的来源,但全局复杂性应该是O(N ^ 2)
答案 2 :(得分:1)
这不是n ^ 3,因为变量i在内部循环中重复使用,使其成为n ^ 2。不知道这本书在哪里获得了O(n)。