假设我有两个代码:
代码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做的那样?对于如何确定运行时间非常困惑。
答案 0 :(得分:1)
让我们在脑海中给出一串代码B:
假设n
非常大,比如至少100个。最初我们有i = 0
,因此外部循环的条件是true
,i
会增加由于第5行(1
)而导致i += 1
。所以此时我们有i = 1
,但在这种情况下,内循环是false
的条件,所以我们继续下一轮外循环。
外环和内环的条件分别为true
和false
,直到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)