求划线部分的执行次数为               
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                for (int k = 1; k <= j; k++) {
                    x=x+y;
                }
            }
        }

 对于这类问题,直接列出最外层的前几项执行次数:
 

①对于i=1,执行次数是1次

②对于i=2,执行次数是1+2次

③对于i=3,执行次数是1+2+3次
所以可以总结出规律,对于n取多少,执行次数  =\sum_{i=1}^{n}\frac{i(i+1)}{2}=\sum_{i=1}^{n}\left ( \frac{i^2}{2}+ \frac{i}{2}\right )

即有      \frac{1}{2}\left [ \left ( 1^2+2^2+3^2+...+n^2 \right ) +\left ( 1+2+3+...+n \right )\right ]=\frac{1}{2}\left [ \frac{n(n+1)(2n+1)}{6} +\frac{n(n+1)}{2}\right ]
             =\frac{n(n+1)(n+2)}{6}

注意:这里用了两个数列的数学运算公式
{\color{Red} \sum_{i=1}^{n}i=1+2+3+...+n=\frac{n(n+1)}{2}}
{\color{Red} \sum_{i=1}^{n}i^2=1^2+2^2+3^2+...+n^2=\frac{n(n+1)(2n+1)}{6}}

所以执行次数(时间复杂度):\large {\color{Blue} \frac{n(n+1)(n+2)}{6}}

 

这里对该问题进行一个扩展,即将最内部第三层循环的初始化变量k改为0进行求解:

求划线部分的执行次数为               
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                for (int k = 0; k <= j; k++) {
                    x=x+y;
                }
            }
        }

相应的执行次数也改变了,还是列出前几项的执行次数:

①对于i=1,执行次数是1+2-1次

②对于i=2,执行次数是1+2+3-1次

③对于i=3,执行次数是1+2+3+4-1次
所以可以总结出规律,对于n取多少,执行次数  =\sum_{i=1}^{n}\left [\frac{(i+1)(i+2)}{2}-1 \right ]=\sum_{i=1}^{n}\left ( \frac{i^2}{2}+ \frac{3i}{2}\right )

即有      \frac{1}{2}\left [ \left ( 1^2+2^2+3^2+...+n^2 \right ) +3\left ( 1+2+3+...+n \right )\right ]=\frac{1}{2}\left [ \frac{n(n+1)(2n+1)}{6} +\frac{3n(n+1)}{2}\right ]
             =\frac{n(n+1)(n+5)}{6}

所以执行次数(时间复杂度):\large {\color{Blue} \frac{n(n+1)(n+5)}{6}}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐