【发布时间】: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虽然我不确定编译器会自动执行此操作),但复杂性问题与语义上等效的不同代码或编译器优化无关。它们是关于编写的代码,因此不影响输出的循环仍然算复杂性(当然在现实世界中你永远不会编写这样的代码)。 -
好的。谢谢你。我会在做复杂性问题时处理它:)