for循环的运行时间 - 第2部分

时间:2011-10-10 03:01:10

标签: performance big-o

这将是关于for循环运行时间分析的问题的第2部分

http://faculty.simpson.edu/lydia.sinapova/www/cmsc250/LN250_Weiss/L03-BigOhSolutions.htm#PR4包含解决方案,我对两个特定的“for”循环有疑问

有人可以向我解释如何计算两者的运行时间。谢谢!

1

sum = 0;
for( i = 0; i < n; i++)
    for( j = 0; j < i*i; j++)
        for( k = 0; k < j; k++)
            sum++;  

2

sum = 0;
for( i = 0; i < n; i++)
    for( j = 0; j < i*i; j++)
        if (j % i ==0)
           for( k = 0; k < j; k++)
               sum++;

2 个答案:

答案 0 :(得分:2)

第一个代码段为O(n^5)

Top Loop    = 0 - O(n)   = O(n)   iterations
Middle Loop = 0 - O(n^2) = O(n^2) iterations
Inner Loop  = 0 - O(n^2) = O(n^2) iterations

Total = O(n^5)

以下是第一段代码的封闭式解决方案:(通过Mathematica计算)

sum = -(1/10)*n + (1/4)*n^2 - (1/4)*n^4 + (1/10)*n^5

这是一个五阶多项式,因此它是:O(n^5)

第二个代码段似乎是O(n^4)

Top Loop    = 0 - O(n)   = O(n) iterations
Middle Loop = 0 - O(n^2) = O(n^2) iterations
If statement enters: O(1 / n) times
Inner Loop  = 0 - O(n^2) = O(n^2) iterations

Total = O(n^4)

以下是第二个片段的封闭式解决方案:(通过Mathematica计算)

sum = -(1/12)*n + (3/8)*n^2 - (5/12)*n^3 + (1/8)*n^4

这是一个四阶多项式,因此它是:O(n^4)

进一步解释if语句的效果:

中间循环从0迭代到i*i。 if语句检查j是否可被i整除。但只有ji的倍数才能实现。

如果ji的倍数是0 <= j < i*i的倍数?恰好i次。因此,只有1/i中间循环的迭代将落入最内层循环。

答案 1 :(得分:1)

第二个for循环语句中的'n'以及其他变量的关系(...,x&lt; = n,...)将真正定义它的速度。尝试将for循环可视化为一个外消旋,第二个陈述说明你要制作多少圈。因此,例如,变量'n'= 1000,那么你必须运行同一圈1000次,真正浪费时间。希望能让你更好地了解事物。