java代码的时间复杂性
问题 1为什么课堂讲师说下面的代码片段是Olog n 2为什么当n>0时for循环不立即终止? 编辑:回答如下-j始终>0,因此理论上无限循环或直到实践中溢出 背景 我正在做一门课程,今晚我们有一个关于算法时间复杂性的课程。它是用Java教授的。 对于所有其他的代码碎片,我理解其复杂性,但这一点让我完全困惑java代码的时间复杂性,java,algorithm,for-loop,time,big-o,Java,Algorithm,For Loop,Time,Big O,问题 1为什么课堂讲师说下面的代码片段是Olog n 2为什么当n>0时for循环不立即终止? 编辑:回答如下-j始终>0,因此理论上无限循环或直到实践中溢出 背景 我正在做一门课程,今晚我们有一个关于算法时间复杂性的课程。它是用Java教授的。 对于所有其他的代码碎片,我理解其复杂性,但这一点让我完全困惑 public class SampleClassOnly { public static void main(String[] args) { int n = 100;
public class SampleClassOnly {
public static void main(String[] args) {
int n = 100;
for(int j = n; j > 0; j++){
System.out.println(j);
}
}
}
现在,我已经运行代码对其进行了测试,对于n0,它似乎运行了1000多次,我使用可视化工具对其进行了可视化检查-见下文
我还发现,当满足终止条件时,它不会停止,即下面突出显示的j>0,这让我感到困惑
也许我遗漏了一些明显的东西?感谢你的指点。谢谢。这绝对不是奥洛格n。这是启用的,因为操作的数量将随您设置n的值线性变化,当然,假设我们将n视为原则上可以更改的输入。当然,循环可以执行的步骤数有一个硬限制,即2^31个步骤。另外,重要的一点是:这将对n的任何特定值执行恒定数量的运算,这就是为什么@Bohemian在评论中认为这是O1
正如其他人所指出的,假设将n设为正数,循环不变量不可能是假的;它会停止的唯一原因是最终会出现整数溢出
对于n>0,它似乎运行了1000次以上
是的,它将运行2^31-n次,然后溢出,因此对于大多数n值,它将运行1000次以上。请注意,for循环:
for (int j = n; j > 0; j++)
{
/* code in block */
}
在功能上等同于:
{
int j = n;
while (j > 0)
{
{
/* code in block */
}
j++;
}
}
所以,正如其他人已经说过的,它将一直运行,直到j溢出。因为它与n成线性关系,所以它是开的
我猜你想做:
for (int j = n; j > 0; j--)
然后它将运行n次,j从n下降到1。但即便如此,它仍然是开着的。它是O1。不是奥洛格。不在 它的时间基本上是恒定的,因为当n=0时,任意n值的最大迭代次数为231次
被限制后,时间复杂度是恒定的。谁说这是Olog n,谁就大错特错了。为什么您认为循环应该立即终止?当条件为假而不是为真时,for循环停止。j>0不是终止条件,而是与终止条件相反:当j>0为真时循环继续。@marstran它不是无限的。循环直到j溢出,是O1。它的固定执行时间为2^31-100次迭代,当j溢出时停止,这是一个负数,将导致for循环终止。我不认为这个问题值得向下投票。很明显,最初提出的问题的前提是不正确的,但这并不意味着问题没有用处;我投了更高的票,因为我认为前提是不正确的,原因很有趣/很有启发性。