这将是关于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++;
答案 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
整除。但只有j
是i
的倍数才能实现。
如果j
,i
的倍数是0 <= j < i*i
的倍数?恰好i
次。因此,只有1/i
中间循环的迭代将落入最内层循环。
答案 1 :(得分:1)
第二个for循环语句中的'n'以及其他变量的关系(...,x&lt; = n,...)将真正定义它的速度。尝试将for循环可视化为一个外消旋,第二个陈述说明你要制作多少圈。因此,例如,变量'n'= 1000,那么你必须运行同一圈1000次,真正浪费时间。希望能让你更好地了解事物。