2015-09-29 108 views
-1

我理解如何获得嵌套循环的大O的一般图片,但嵌套for循环中每个循环的操作是什么?大O嵌套循环分解循环循环

如果我们有:

for(int i=0; i<n; i++) 
{ 
    for(int j=i+1; j<1000; j++) 
    { 
     do something of constant time; 
    } 
} 

我们究竟是如何会得到T(N)?外循环将是n次操作,内部将是1000(n-1),内部将是c是对的?

那么T(n)=cn(1000(n-1))是吗?

+0

一起处理两个循环 - https://en.wikipedia.org/wiki/Arithmetic_progression –

+1

“做某事”将运行到n = 999.所以O(1)是时间复杂度 – Zap

回答

0

您想折叠循环并进行双重求和。当i = 0时,您运行1000-1次。当i = 1时,运行1000 - 2次,依此类推直至n-1。这相当于从 = 0到系列999 ñ总和 - ,请注意,你可以单独的条款,并得到999 ñ - ññ - 1)/ 2。

这是一个很奇怪的公式,因为一旦n达到1000,内循环立即短路并且什么也不做。在这种情况下,则渐近时间复杂度实际上是O(n),因为对于高值n,代码将在常量时间内跳过内部循环。

+0

我刚问过我的教授。由于@Zap表示它是O(1),而不是线性的,因为内部循环只会在n小于1000时执行,所以对于大n(例如1,001和100,000,000)它将是相同的。它可能是线性的,直到1000,但在那之后它是恒定的。...... – ohbrobig

+1

它仅在内循环调用的数量上是不变的。这忽略了每个外循环比较* i * + 1到1,000的成本,这使得时间复杂度成线性。 – Davislor