多重for循环嵌套中语句的执行次数

实例代码

for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
       for (int k = j + 1; k < n; k++) {
            count++;
       }
    }
}

以上代码中,求count++语句的执行次数。

其实这段代码中求count++语句的执行次数等价于:从n个整数中取出三个整数的组合总共有多少种(不考虑顺序,1,2,3 2,3,1 等算一种)。

求解过程

n > 2 时 : n>2时: n>2

      当 i = 0 时 , j = 1 ∼ ( n − 1 ) , c o u n t 的 执 行 次 数 为 ( ( n − 1 ) − 1 ) + ( n − 3 ) + ( n − 4 ) + ⋯ + 2 + 1 当i=0时,j=1\sim (n-1),count的执行次数为((n-1)-1)+(n-3)+(n-4)+\cdots+2+1 i=0j=1(n1)count((n1)1)+(n3)+(n4)++2+1

      当 i = 1 时 , j = 2 ∼ ( n − 1 ) , c o u n t 的 执 行 次 数 为 ( ( n − 1 ) − 2 ) + ( n − 4 ) + ( n − 5 ) ⋯ + 2 + 1 当i=1时,j=2\sim (n-1),count的执行次数为((n-1)-2)+(n-4)+(n-5)\cdots+2+1 i=1j=2(n1)count((n1)2)+(n4)+(n5)+2+1

      当 i = 2 时 , j = 3 ∼ ( n − 1 ) , c o u n t 的 执 行 次 数 为 ( ( n − 1 ) − 3 ) + ( n − 5 ) + ⋯ + 2 + 1 当i=2时,j=3\sim (n-1),count的执行次数为((n-1)-3)+(n-5)+\cdots+2+1 i=2j=3(n1)count((n1)3)+(n5)++2+1

                                          ⋮ \vdots

      当 i = n − 3 时 , j = ( n − 2 ) ∼ ( n − 1 ) , c o u n t 的 执 行 次 数 为 1 当i=n-3时,j=(n-2)\sim (n-1),count的执行次数为1 i=n3j=(n2)(n1)count1

      当 i = n − 2 时 , j = ( n − 1 ) , c o u n t 的 执 行 次 数 为 0 当i=n-2时,j=(n-1),count的执行次数为0 i=n2j=(n1)count0

可以看出,每次i产生变化时,count++语句的执行次数都是一个等差数列,可由等差数列求和公式:
S n = n ( a 1 + a n ) 2 = 1 + 2 + ⋯ + n = n ( 1 + n ) 2 = n 2 + n 2 S_n=\frac{n(a_1+a_n)}{2}=1+2+\cdots+n=\frac{n(1+n)}{2}=\frac{n^2+n}{2} Sn=2n(a1+an)=1+2++n=2n(1+n)=2n2+n
count++总执行次数 S n : S_n: Sn:
S n = ( n − 2 ) 2 + ( n − 2 ) 2 + ( n − 3 ) 2 + ( n − 3 ) 2 + ⋯ + 2 2 + 2 2 + 1 2 + 1 2 = ( ( n − 2 ) 2 + ( n − 3 ) 2 + ⋯ + 2 2 + 1 2 ) + ( ( n − 2 ) + ( n − 3 ) + ⋯ + 2 + 1 ) 2 S_n=\frac{(n-2)^2+(n-2)}{2}+\frac{(n-3)^2+(n-3)}{2}+\cdots+\frac{2^2+2}{2}+\frac{1^2+1}{2}\\ =\frac{((n-2)^2+(n-3)^2+\cdots+2^2+1^2)+((n-2)+(n-3)+\cdots+2+1)}{2} Sn=2(n2)2+(n2)+2(n3)2+(n3)++222+2+212+1=2((n2)2+(n3)2++22+12)+((n2)+(n3)++2+1)
再由公式:
1 2 + 2 2 + ⋯ + n 2 = n ( n + 1 ) ( 2 n + 1 ) 6 1^2+2^2+\cdots+n^2=\frac{n(n+1)(2n+1)}{6} 12+22++n2=6n(n+1)(2n+1)
得:
S n = ( n − 2 ) ( n − 2 + 1 ) ( 2 ( n − 2 ) + 1 ) 6 + ( n − 2 ) 2 + ( n − 2 ) 2 2 = n ( n − 1 ) ( n − 2 ) 6 S_n=\frac{\frac{(n-2)(n-2+1)(2(n-2)+1)}{6}+\frac{(n-2)^2+(n-2)}{2}}{2}\\ =\frac{n(n-1)(n-2)}{6} Sn=26(n2)(n2+1)(2(n2)+1)+2(n2)2+(n2)=6n(n1)(n2)
0 < n < 2 时 : 0<n<2时: 0<n<2

count++的执行次数为0, n > 2 n>2 n>2的公式仍适用于 0 < n < 2 0<n<2 0<n<2的情况。

即:

count++语句的执行次数为 n ( n − 1 ) ( n − 2 ) 6 \frac{n(n-1)(n-2)}{6} 6n(n1)(n2)

参考文章

一个小问题:计算3层循环的执行次数

你可能感兴趣的:(算法)