Algorithm 以下代码的增长顺序?

Algorithm 以下代码的增长顺序?,algorithm,big-o,nested-loops,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++; 但这并不能真正帮助我弄清楚增长的顺序。 也许有更好的方法找到它?这看起来像是一个家庭作业问题,所以我会给你一些提示 1) 假设您只有内部循环。作为i和j的函数,你通过内循环多少次?循环的每次迭代执行多少操作?总共应该执行多少个操作 2) 现在假设你只有两个内部

我被问到以下问题,无法决定正确答案:

for (int i=1; i<=n/2; i++)
  for(int j=i; j<=n-i;j++)
    for(int k=i;k<=j;k++)
      x++;
但这并不能真正帮助我弄清楚增长的顺序。
也许有更好的方法找到它?

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

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。因此,增长的顺序是ω(n^3)。

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

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


但是它仍然是立方的。

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

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

但它有3个嵌套循环并不意味着它实际上是立方的。你为什么认为它是立方的?试着找出i的平均值作为n的函数,j作为i的函数,等等。@Atlante我没有给出答案的一个原因是因为我不知道,但当你从i到n-2,那就是O(n),当你从0到n-i,随着i的增加,平均到n/4,也就是O(n)。最后一个语句实际上更难计算,因为它甚至不使用n,所以您必须进行数学运算。你可以考虑添加一些打印语句并运行代码,这样你就可以更好地想象发生了什么。这不是一个家庭作业,而是一个我无法理解的先前测试的问题。如果有什么令人困惑的地方,请告诉我。哇,谢谢!!实际上,在你的第一次帮助下,我设法找出了内部的两个循环。我唯一得不到的是:模一个常数因子,大约是1+2+…+的一半n^2,通过归纳,它是n(n+1)(2n+1)/6。因此,生长顺序为ω(n^3)。你能帮忙吗?谢谢!!哦,事实上我明白了!谢谢!1 + 2 + ... + n^2=n^2(n^2+1)/2或者你是说1+4+9+…+n^2?你是怎么做到的?@atlanteh:见编辑谢谢!!非常有用!!谢谢。反正我自己做的!
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