Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java代码的时间复杂性_Java_Algorithm_For Loop_Time_Big O - Fatal编程技术网

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;

问题

1为什么课堂讲师说下面的代码片段是Olog n

2为什么当n>0时for循环不立即终止? 编辑:回答如下-j始终>0,因此理论上无限循环或直到实践中溢出

背景 我正在做一门课程,今晚我们有一个关于算法时间复杂性的课程。它是用Java教授的。 对于所有其他的代码碎片,我理解其复杂性,但这一点让我完全困惑

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循环终止。我不认为这个问题值得向下投票。很明显,最初提出的问题的前提是不正确的,但这并不意味着问题没有用处;我投了更高的票,因为我认为前提是不正确的,原因很有趣/很有启发性。