下面的代码的时间复杂度是多少?
int i = 0;
while(i*i <=N) {
for(int j = 0; j <=N; j++) {
for(int k = 0; k <=N; k++, i++) {
//O(1) operation
}
}
i++;
}
在嵌套循环中,如果外循环1花费O(1)时间,内循环2花费O(logn)时间,内循环3花费O(n)。 然后是总T.C.是O(1)O(logn)O(n)= O(nlogn)。是真的吗?
请解释。
答案 0 :(得分:2)
tl; dr:此代码在O(n^2)
中运行。
详细答案:
外部“循环”:while (i*i <= M)
令人分心。
因为i
在最内层循环的每次迭代中都会增加-这意味着当您重新评估其中的条件时,i
的值将为{{1} }。这意味着,外循环总是只重复一次。
现在,一旦您忽略它,很容易看到其余代码的时间复杂度为N*N
,因为基本上可以将其重写为:
O(N^2)
注意:此答案假定变量没有溢出,特别是int i = 0;
if (i * i <= N) { // Since the while loop does not repeat more than once
for(int j = 0; j <=N; j++) {
for(int k = 0; k <=N; k++, i++) {
//O(1) operation
}
}
i++;
}
没有溢出
答案 1 :(得分:0)
嵌套循环的大O时间复杂度
“ //O(1) operation
”操作已执行(N+1)^2
次。循环本身进行的计算(例如执行测试j<=N
)的次数也是平方(N^2+a*N+b
)。
所以时间复杂度为O(N^2)
。
您可以通过以下方式扩展程序来进行测试:
int i=0;
int count=0;
while(i*i <= N)
{
for(int j=0; j<=N; j++)
{
for(int k=0; k<=N; k++, i++)
{
count++;
}
}
i++;
printf("i after the while() loop: %d\n",i);
}
printf("Number of steps: %d\n",count);
您使用不同的N
值测试程序,您会看到:
i
是(N+1)^2+1
循环的第一遍之后的while()
。这意味着条件i*i<=N
等于(N+1)^4 + 2*N^2 + 3*N <= (-2)
。对于N>=0
来说总是错误的。count++
操作(代表我们的O(1)
操作)进行了(N+1)1^2
次。时间复杂度
通常在CS Stack Exchange网站上而不是在StackOverflow上问这类问题。
StackOverflow仅用于有关编写计算机程序的问题。
(请注意,StackOverflow是StackExchange网络的一部分,您可以将所有StackExchange web sites与用户帐户一起使用。)