嵌套循环的大O时间复杂度

时间:2020-08-16 05:04:45

标签: algorithm data-structures time-complexity big-o

下面的代码的时间复杂度是多少?

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)。是真的吗?

请解释。

2 个答案:

答案 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与用户帐户一起使用。)