sam*_*101 0 c complexity-theory big-o loops time-complexity
为什么时间复杂度不是O(n ^ 2)而是O(n)?不是第一个循环是n
时间,而第二个循环是相同的,所以它变成了O(n*n)
,这里有什么问题?
void f(int n){
for( ; n>0; n/=2){
int i;
for(i=0; i<n; i++){
printf("hey");
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一个循环不是
n
时间,第二个循环是同一个,所以它变成了O(n*n)
.
以上陈述是错误的,因为:
n
.(外循环运行O(log n)
时间,但在这种情况下无关紧要.)n
随变化值的不同而不同.为了获得此代码的时间复杂度,我们应该计算内循环体执行的总次数.
n
对于每个值,内循环的主体执行次数n
.n
由for
外循环的语句确定.它从作为函数参数给出的值开始,并且每次执行外循环体时减半.正如评论中已经说过的那样,因为n + n/2 + n/4 + n/8 + ... = 2n
这个算法的时间复杂度是O(n)
.
对于一些更具体的数学证明:
找到一个整数k
这样2^(k-1) < n <= 2^k
.为此k
:
1 + 2 + 4 + ... + 2^(k-1) = 2^k - 1 >= n - 1 ? ?(n)
.1 + 2 + 4 + ... + 2^k = 2^(k+1) - 1 < 4n - 1 ? O(n)
.因此,内环的总数?(n)
也是如此O(n)
.