查看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).
我是对的,或者我错过了什么?
谢谢!
答案 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)次(与第一个例子中一样)