【问题标题】:C - Time complexity of nested loopsC - 嵌套循环的时间复杂度
【发布时间】:2018-08-05 14:17:10
【问题描述】:

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

     int j = 0;
     for(i=0;i<n;i++)
     {
         for(i=0;i<n*n ;i++)
         {
             while(j<n)  
             {
                 j++;
             }
         }
     }

我的尝试-

外部 for 循环只会运行一次。 内部 for 循环将运行 n*n 次,但仅当 i=0 时,while 循环将运行 n 次。 现在,

我的困惑是-

如果我把 n+(n^2−1)∗O(1) 写成 n+O(1)+O(1)+.........+O(1) 那么我可以忽略低阶项和复杂度将为 O(n),但另一个推理可能是正在完成 n^2 次的恒定工作量,因此时间复杂度应为 O(n^2)

这个问题也发生了类似的事情- Time complexity O(N) of nested loops with if-statement: O(N^4)?

根据上面链接中给出的推理- 我可以简单地重写上面的代码-

  j=0;
    while(j<n)
    {
        j++;
    }

这消除了那些没有进入while循环的步骤。 所以 T.C 应该是 O(n)。

这两种推理对我来说都很直观。请帮帮我。

【问题讨论】:

  • 我不知道您的代码中的奇怪之处(例如外部 for 循环无用和 while 循环仅在第一次执行)是您的错误还是作者试图使问题变得更棘手。
  • "如果我把 n+(n^2−1)∗O(1) 写成 n+O(1)+O(1)+.........+O( 1) 然后我可以忽略低阶术语“除非... 代表 constant 的 1 数,否则您不能删除它。如果可以,一切都将是O(1)(您可以将任何变量替换为可变数量的+1s,然后删除它们)。
  • 作者试图让它变得更狡猾。非常感谢。您的这一行-“除非 ... 代表恒定数量的 1,否则您无法删除它。如果可以,一切都会 O(1) 清除我所有的疑虑。:)
  • 你(或编译器)可以重写代码 if i 在循环之后永远不会使用(如果是,你可以添加 i=n*n+1虽然我不确定编译器会自动执行此操作),但复杂性问题与语义上等效的不同代码或编译器优化无关。它们是关于编写的代码,因此不影响输出的循环仍然算复杂性(当然在现实世界中你永远不会编写这样的代码)。
  • 好的。谢谢你。我会在做复杂性问题时处理它:)

标签: algorithm time-complexity


【解决方案1】:

时间复杂度为O(n^2)

外循环只运行一次,所以可以忽略。中间循环运行n*n 次,其中只有第一次迭代需要O(n) 步,其余的是O(1),因为j 将是n

所以它是O(n^2 + n) = O(n^2)

【讨论】:

  • 对不起,它只是求幂。请根据它编辑答案。我正在编辑问题。
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多