家庭作业:为代码片段寻找Big-Oh

时间:2013-01-29 04:30:33

标签: big-o

要与大家保持联系,这是一项家庭作业。我不希望有人为我提供答案,更多的是检查我是否正确理解事情或弄清楚我做错了什么。

我已经获得了一些代码片段来确定Big-Oh会是什么样的。每个人都在处理for循环,但是我们给出的最后两个却让我失望了。第一个:

   sum = 0;
      for (i = 0; i < n; i++) //1
         for (j = 0; j < i * i; j++) //2
            for (k = 0; k < j; k++) //3
               sum++;

我认为Big-Oh会是O(n ^ 4)。 #1将运行n次,#2将运行n ^ 2次,#3将运行n次,给我n ^ 4。但是,当我在C ++中正确地写这个并且给出n值10,100和1000(根据我的分配)时,n = 10返回7524(好,小于10,000)n = 100返回值975,002,490,而上限将是100,000,000。显然,我在循环分析的某个地方,但我不确定在哪里。不知道n = 1000会返回什么,因为我的计算机已经捣乱了一段时间,似乎还没准备好给我一个答案。

第二个片段如下:

   sum = 0;
      for (i = 0; i < n; i++) //1
         for (j = 0; j < i * i; j++) //2
            if (j % i == 0) //3
               for (k = 0; k < j; k++) //4
                  sum++;

我相信我可以安全地忽略if语句,因为它的运行时间是测试的运行时间加上它的内容,这意味着我会再次提出O(n ^ 4)。

1 个答案:

答案 0 :(得分:0)

嗯,我不是一个很大的O专家,但我知道循环和一些数学,所以我会尝试帮助你。

当你考虑你的陈述“#1将运行n次,#2将运行n ^ 2次,#3将运行n次,给我n ^ 4”它只是部分正确..是的数字是如果你分开运行循环几乎是正确的。但是考虑一个n = 4的例子......第一个#1将运行4次,但是对于循环数#1循环的每次迭代,数字#2将运行i * i次...所以..

首先,当i = 0时,#2将运行0次..(j <0 * 0) 然后当i = 1#2将运行1次(j <1 * 1) 然后当i = 2#2循环将运行4次(j <2 * 2) 当i = 3#2时,将运行9次(j <3 * 3)

因此总共#2将运行14次。 (0 + 1 + 4 + 9)和4 ^ 4不是14.而且这也升级为#3循环。

正如你所说,你对直接回答不感兴趣,我希望这有助于你更好地理解for循环。