当前位置: 首页 > 知识库问答 >
问题:

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

宋景福
2023-03-14

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

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)。那么总的tc是O(1)O(logn)O(n)=O(nlogn)。这是真的吗?

请解释一下。

共有2个答案

苏晓博
2023-03-14

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

操作“//O(1)操作”被执行(n1)^2次。以及循环本身进行计算的次数(例如,执行测试j

所以时间复杂度是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(n1)^21while()循环的第一次通过之后。这意味着条件i*i

时间复杂性

此类问题通常在CS Stack Exchange网站上提出,而不是在StackOverflow上。

StackOverflow仅适用于有关编写计算机程序的问题。

(请注意,StackOverflow是StackExchange网络的一部分,您可以使用您的用户帐户使用所有StackExchange网站。)

伯逸明
2023-03-14

tl; dr:这段代码在O(n^2)中运行。

详细答案:
外环:而(i*i

因为i在最内部循环的每一次迭代中都会自我增加,这意味着当你重新评估其中的条件时,i的值将是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++;
}

注意:这个答案假设变量没有溢出,特别是i没有溢出

 类似资料:
  • 这段代码的时间复杂度是多少?外循环运行n次,但我不确定内循环。如果内环对于i的每个值一直运行到n,它能是O(n^2)吗?

  • 我很难理解算法分析,尤其是下面的例子: 所以我的理解是,外循环是,当我乘以一个常量时,我不确定是否有任何区别。 不过,最让我困惑的是内部循环。我认为它是,因为j被常数递减,但我不确定和

  • 我试图为这段代码找出一个大O的紧密界限: 如果我们从内最循环开始,它将在最坏的情况下运行k=n^2次,占O(N^2)。如果语句每次j=m*i时都为真,其中m是一个任意常数。由于j从1运行到i^2,这将在m={1,2,...,i}时发生,这意味着它将在i次时为真,i最多可以是n,所以最坏的情况将是m={1,2,...,n}=n次。如果i=n,第二个循环应该有O(N^2)的最坏情况。外环具有O(N)的

  • 我的困惑是- 如果我把n+(n^2-1)*O(1)写成n+O(1)+O(1)+........+O(1),那么我可以忽略低阶项,复杂性将是O(n),但是另一个推理可以是一个常数的工作量正在做n^2次,所以时间复杂性应该是O(n^2) 在这个问题中也发生了类似的事情-带有if语句的嵌套循环的时间复杂度O(N):O(N^4)?

  • 以下示例循环的时间复杂度为O(n^2),有人能解释为什么是O(n^2)吗?因为这取决于c的价值。。。 循环1--- 回路2--- 如果c=0;然后它运行无限次,就像增加c值一样,内部循环的运行次数也会减少 有人能给我解释一下吗?

  • 关于嵌套for循环的时间复杂性,,我遇到过几篇帖子。它是否仍然适用于我在下面提到的两种情况? 案例1:Second for循环的增量不是1,而是每次迭代都乘以2 案例2:第二个循环以开始,每次迭代递增1。 在这两种情况下,都是一个整数。我认为这两种情况下的时间复杂度都是。这就是实际的时间复杂性吗?