for循环的运行时间

时间:2011-09-19 16:03:10

标签: math big-o

查看http://faculty.simpson.edu/lydia.sinapova/www/cmsc250/LN250_Weiss/L03-BigOh.htm#Counting上嵌套for循环的运行时间的示例和说明,第二个示例对我来说不合适。

示例1

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

马上就有意义。外部for循环是O(n)。 Inner for Loop也是O(n)。将它们相乘,O(n) * O(n) = O(n*n) = O(n^2).

第二个例子。 Inner for循环不以0开头。

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

内循环的运行时间为( 1 + 2 + … + n) = n*(n+1)/2 = O(n^2)与第一个示例一样,外循环在O(n)处运行。因此,总运行时间是O(n) * O(n^2) = O(n^3).我是对的,或者我错过了什么? 谢谢!

4 个答案:

答案 0 :(得分:4)

(1 + 2 + … + n) = n*(n+1)/2 = O(n^2)是该计划的时间。您不需要将它乘以O(n)作为外循环;你已经把外环考虑在内了。

[注意:从技术上讲,可以说算法是O(n^3)。这只是有点误导。]

答案 1 :(得分:3)

您正在累加内循环的运行时间 - 而不是外循环每次迭代的运行时间。每次外部迭代的内部循环的运行时间仍为O(n),导致总体结果为O(n 2 )。

换句话说 - 如果您理解第一个示例,并且第二个示例 less 比第一个示例更有效,那么它怎么会有更大复杂度?< / p>

答案 2 :(得分:1)

内循环的运行时间平均约为n / 2,因此仍为O(n),与第一个示例相同。

答案 3 :(得分:0)

回应上面的前两个答案。 我看不出(1 + 2 + … + n) = n*(n+1)/2 = O(n^2)将如何运行时间

说,n = 3

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

内循环的总运行时间是1次+ 2次+ 3次

那么,外环发挥作用的地方?它也运行O(n)次(与第一个例子中一样)