我试图理解在下面的代码中执行语句“x = x + 1”多少次,作为“n”的函数:
for (i=1; i<=n; i++)
for (j=1; j<=i; j++)
for (k=1; k<=j; k++)
x = x + 1 ;
如果我没错,第一个循环执行 n 次,第二个循环 n(n + 1)/ 2 次,但是在第三个循环我走开。也就是说,我可以指望它会被执行多少次,但我似乎无法找到公式或用数学术语解释它。
你能吗?
顺便说一下,这不是家庭作业或其他任何东西。我刚刚在一本书上发现并认为这是一个有趣的概念。
答案 0 :(得分:14)
考虑循环for (i=1; i <= n; i++)
。看到这会循环 n 次,这是微不足道的。我们可以将其绘制为:
* * * * *
现在,当你有两个这样的嵌套循环时,你的内循环将循环 n(n + 1)/ 2 次。请注意这是如何形成三角形的,事实上,这种形式的数字称为triangular numbers。
* * * * *
* * * *
* * *
* *
*
因此,如果我们将其扩展到另一个维度,它将形成一个四面体。由于我不能在这里做3D,想象每一个都是彼此叠加的。
* * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * *
* * *
*
这些被称为tetrahedral numbers,由此公式生成:
n(n+1)(n+2)
-----------
6
您应该能够确认小测试程序确实如此。
如果我们注意到 6 = 3!,那么看how this pattern generalizes to higher dimensions就不难了:
n(n+1)(n+2)...(n+r-1)
---------------------
r!
此处, r 是嵌套循环的数量。
答案 1 :(得分:1)
数学公式为here。
这是O(n ^ 3)的复杂性。
答案 2 :(得分:1)
此数字等于三元组数{a,b,c},其中&lt; = b&lt; = c&lt; = n。 因此,它可以表示为Combination with repetitions.。在这种情况下,重复组合的总数为:n(n + 1)(n + 2)/ 6
答案 3 :(得分:0)
第3个内部循环与第2个内部循环相同,但 n 是一个公式。
所以,如果你的外环是 n 次......
,你的第二个循环是n(n+1)/2
次......
你的第三个循环是......
(n(n+1)/2)((n(n+1)/2)+1)/2
它相当蛮力,绝对可以简化,但它只是算法递归。
答案 4 :(得分:0)
1 +(1 + 2)+(1 + 2 + 3)+ ...... +(1 + 2 + 3 + ... n)
答案 5 :(得分:0)
你知道第二个循环执行了多少次,所以可以用一个循环替换前两个循环吗?像
for(ij = 1; ij < (n*(n+1))/2; ij++)
for (k = 1; k <= ij; k++)
x = x + 1;
应用你用于第一个的相同公式,其中'n'是这个时间n(n + 1)/ 2你将拥有((n(n + 1)/ 2)*(n(n + 1) )/ 2 + 1))/ 2 - 执行x = x + 1的次数。