我有 2 个函数,我需要在 Big O 中找到这两个函数的执行时间,但我对 fnB 感到困惑
int fnA(int n){
int sum = 0;
for(int i=0; i<n; i++){
for(int j=n; i<j; j=j-2){
sum += i*j;
}
return sum;
}
我得到了 O(n^2( for fnA
int fnB(int n) {
int sum =0;
for(int size = 1; size<n; size=2*size){
sum+=fnA(size);
}
return sum;
}
由于在 fnB 中的 for 循环中,大小呈指数级增长。我倾向于 fnB 有一个 O(n^3(。我是否正确,如果不是,请纠正我,谢谢
fnA
的运行时间为 O(n2(。
但是,fnB
的运行时间为 O(n 2 logn(,因为它有 log 2 n 次迭代,并且每次迭代需要 O(n 2( 时间(实际上需要 O(大小 2(,但从size
<n
>2( 绑定(。
更详细的解释:
fnA(n)
在外循环中有n
次迭代,在内循环中最多有n/2
次迭代,这给出了 O(n2( 上限。由于每次迭代fnB(n)
调用fnA(size)
,它需要 O(大小2( == O(n2( (自size
现在,fnB(n)
循环将以下值分配给size
:20, 21, 22, ..., 2 k,其中 2k<= n。因此,迭代次数为 k <= log 2 n,fnB
的上限为 O(n 2 log2n(。
Big-O表示法可用于表示算法的时间复杂度或空间复杂度。
在你的程序中,函数 fnA 可以被认为是具有 O(n^2( 的时间复杂度,因为它有两个嵌套的for
循环。 但是,由于条件i<j
的计算结果始终为 false,内部for
循环将永远不会执行。因此,fnA
函数更现实的时间复杂度是 O(n(。
fnB
函数在单个for
循环中调用fnA
。因此,它的时间复杂度为 O(n^2(。