我收到了以下问题,无法确定正确的答案:
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?
的函数我设法弄明白:
T(n) = n*(n-1) + T(n-2)
但这并没有真正帮助我弄清楚增长的顺序。 也许有更好的方法来找到它?
答案 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)
我试图计算它,我发现(数学规则!)。所以这是立方体。 - &GT; 回答1。 T(n) = (13/12) * n * (n² + 3*n + 2)
编辑:计算中出错。真正的答案是T(n) = n * (n + 2) * (2*n - 1) / 24
:
然而它仍然是立方体。