以下代码的增长顺序?

时间:2012-11-29 17:59:25

标签: algorithm big-o nested-loops

我收到了以下问题,无法确定正确的答案:

for (int i=1; i<=n/2; i++)
  for(int j=i; j<=n-i;j++)
    for(int k=i;k<=j;k++)
      x++;

x的增长顺序是n?

的函数
  1. Ω(N ^ 3)。
  2. Θ(N ^ 2.5)
  3. Θ(N ^ 2)
  4. Ο(nlogn)
  5. 以上都不是
  6. 我设法弄明白:

    T(n) = n*(n-1) + T(n-2)
    

    但这并没有真正帮助我弄清楚增长的顺序。 也许有更好的方法来找到它?

3 个答案:

答案 0 :(得分:2)

这看起来像是一个家庭作业问题所以我只会给你提示。

1)假设你只有内循环。作为i和j的函数,你通过内循环多少次?每次迭代循环执行多少次操作?应该总共执行多少次操作?

2)现在假设你只有内在的两个循环。你有多少次通过外环,作为i和n的函数?每次通过外循环时,您通过内循环多少次? (提示:这应该根据j是不同的)总共应该执行多少次操作?

3)现在您已准备好了解整个问题。您通过内部两个循环(作为n的函数)多少次,以及每次迭代应执行多少操作?总共执行了多少次操作? (这是你的答案)


好的,你说这不是一个家庭作业问题,实际上它比我想象的要难,所以我只是给你答案。

每个内循环在时间j-i中运行。

第二个循环在时间上运行(i - i)+(i + 1 - i)+ ... +(i + n - 2i - i)= 1 + 2 + ... +(n - 2i) =(n - 2i)(n - 2i + 1)/ 2,通过数学归纳法。

当计算生长顺序时,1项与n相比非常小,因此外环在大约n ^ 2/2 +(n-2)^ 2/2 +(n-4)^ 2中运行/ 2 + ... + 1/2。

这大约是1 ^ 2 + 2 ^ 2 + ... + n ^ 2的四分之一,其通过归纳是n(n + 1)(2n + 1)/ 6。因此,增长的顺序是Omega(n ^ 3)。

答案 1 :(得分:0)

有人在上面的评论中提到了印刷语句。以下是一些:

n = 20 --> x = 715
n = 21 --> x = 825
n = 22 --> x = 946
n = 23 --> x = 1078
n = 24 --> x = 1222
n = 25 --> x = 1378
n = 26 --> x = 1547
n = 27 --> x = 1729
n = 28 --> x = 1925
n = 29 --> x = 2135
n = 30 --> x = 2360
n = 31 --> x = 2600
n = 32 --> x = 2856
n = 33 --> x = 3128
n = 34 --> x = 3417
n = 35 --> x = 3723
n = 36 --> x = 4047
n = 37 --> x = 4389
n = 38 --> x = 4750
n = 39 --> x = 5130
n = 40 --> x = 5530

答案 2 :(得分:-1)

我试图计算它,我发现T(n) = (13/12) * n * (n² + 3*n + 2) (数学规则!)。所以这是立方体。 - &GT; 回答1。

编辑:计算中出错。真正的答案是T(n) = n * (n + 2) * (2*n - 1) / 24

demonstration

然而它仍然是立方体。