对嵌套循环的时间复杂性和查找提示感到困惑

时间:2014-09-26 02:52:17

标签: big-o

假设我有两个代码:

代码A:

for i = 0;
for j = 0;
while(i<n){       // O(n)
    while(j<n){   // O(n)
       printf("hello");
       .....

运行时间= o(n)x O(n)= O(n ^ 2)..

代码B:

int result = 0;
int i = 0;
while (i < n/2){    //O(n)
result += arr[i];
i += 1;
    while(i >= n/2 && i < n){   //O(n)
        results += arr[i];
        i +=1;
        }

运行时间= O(n)

对于代码B,我们不要将两个O(n)乘以得到O(n ^ 2),就像我们为代码A做的那样?对于如何确定运行时间非常困惑。

1 个答案:

答案 0 :(得分:1)

让我们在脑海中给出一串代码B:

假设n非常大,比如至少100个。最初我们有i = 0,因此外部循环的条件是truei会增加由于第5行(1)而导致i += 1。所以此时我们有i = 1,但在这种情况下,内循环是false的条件,所以我们继续下一轮外循环。

外环和内环的条件分别为truefalse,直到i变为n/2 - 1,在此阶段,外部条件为循环为true,因此i增加到n /2,在这种情况下,内循环的条件也变为true。因此内部循环将i增加到n

最后,我们有i = n,循环的条件都是false,并且它不会进一步循环。

所以复杂性如下:

i          Work done
------------------------
0          1
1          1
2          1
.          .
.          .
.          .
n/2-2      1
n/2-1      n/2 + 1

所以完成的工作总是:

(1 + n/2 - 2) * 1 + 1 * (n/2 + 1) = O(n)