首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用if-else块的for循环的时间复杂度

使用if-else块的for循环的时间复杂度
EN

Stack Overflow用户
提问于 2021-02-24 21:45:44
回答 4查看 98关注 0票数 2

我想找出这段代码的时间复杂度。我的理解是-

外部的for循环将循环2n次,在最坏的情况下,当i==n时,我们将进入if块,其中嵌套的for循环的复杂度为O(n^2),将外部for循环计算在内,代码块的时间复杂度将为O(n^3)

在最好的情况下,i!=n,else具有O(n)的复杂度,而外部的for循环是O(n),这使得复杂度,在最好的情况下是O(n^2)

我说的对吗?还是我漏掉了什么?

代码语言:javascript
运行
复制
for (int i = 0; i < 2*n; i++)
{
   if (i == n)
   {
      for (int j = 0; j < i; j++)
         for (int k = 0; k < i; k++)
            O(1)
   }
   else
   {
      for (int j = 0; j < i; j++)
         O(1)
   }
}
EN

回答 4

Stack Overflow用户

发布于 2021-02-24 22:02:59

不是的。

问题“什么是T(n)?”您所说的是“如果i=n,则O(n^3),否则O(n^2)”。但问题中没有i,只有n。

想一想类似的问题:“在一周中,Pete周三工作10个小时,每隔一天工作1小时,Pete一周的总工作时间是多少?”你不会真的回答“如果星期是星期三,那么是X,否则是Y”。你的答案必须包括周三和每隔一天的工作时间。

回到你最初的问题,星期三是i=n的情况,所有其他的日子都是i!=n的情况,我们必须把它们加起来才能找到答案。

票数 3
EN

Stack Overflow用户

发布于 2021-02-24 22:37:43

这是一个关于每个循环执行O(1)的次数的问题。时间复杂度是n的函数,不是i的函数。也就是说,“O(1)在n上执行了多少次?”

i == n.

  • There在所有其他情况下都是
  • O(n^2)循环的(2n - 2)实例时,O(n)循环有一次运行。

因此,时间复杂度为O((2n - 2) * n + 1 * n^2) = O(3n^2 - 2*n) = O(n^2)

我已经编写了一个C程序来显示n^2、实际值和n^3的前几个值,以说明它们之间的区别:

代码语言:javascript
运行
复制
#include <stdio.h>

int count(int n){
 int ctr = 0;
 for (int i = 0; i < 2*n; i++){
    if (i == n)
      for (int j = 0; j < i; j++)
         for (int k = 0; k < i; k++)
            ctr++;
    else
      for (int j = 0; j < i; j++)
         ctr++;
 }
 return ctr;
}

int main(){
 for (int i = 1; i <= 20; i++){
  printf(
   "%d\t%d\t%d\t%d\n", 
   i*i, count(i), 3*i*i - 2*i, i*i*i
  );
 }
}

Try it online! (您可以将其粘贴到Excel中以绘制值。)

票数 1
EN

Stack Overflow用户

发布于 2021-02-25 05:46:14

第一个循环重复2*n次:

代码语言:javascript
运行
复制
for (int i = 0; i < 2*n; i++)
{
    // some code
}

i == n和时间复杂度为:O(n^2)时,此部分只出现一次

代码语言:javascript
运行
复制
if (i == n)
{
    for (int j = 0; j < i; j++)
        for (int k = 0; k < i; k++)
            O(1)
}

而这一部分则依赖于i

代码语言:javascript
运行
复制
else
{
    for (int j = 0; j < i; j++)
        O(1)
}

在以下情况下考虑i

循环重复0

循环重复1

循环重复2

循环重复n次。(这里的n是2*n)

所以循环重复了(n*(n+1)) / 2

但是当i == n else部分不工作时,(n*(n+1)) / 2 - n和时间复杂度就是O(n^2)

现在我们对所有这些部分求和:O(n^2) (first part) + O(n^2) (second part),因为第一部分只出现一次,所以它不是O(n^3)

时间复杂度是:O(n^2)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66352165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档