该算法的Big-O复杂度

Big-O complexity of this algorithm

本文关键字:复杂度 Big-O 算法      更新时间:2023-10-16

代码:

void fun(int n){
    if(n>2){
        for(int i=0;i<n;i++){
            j=0;
            while(j<n){
                cout<<j;
                j++;
            }
        }
        fun(n/2);
    }
}

以下是我的想法:递归部分正在运行log(n)次?在每次递归调用期间,for循环将运行n^2次,每次递归调用中n将变为一半。所以它是n^2+(n^2)/4+(n^ 2)/16+…+1.

你是对的,所以大(O)是n^2,因为级数n^2+(n^2)/4+(n^ 2)/16+…+1从不超过2n^2

cout的写入次数由以下递归给出:

T(N) = N² + T(N/2).

通过有根据的猜测,T(N)可以是一个二次多项式。因此

T(N) = aN²+bN+c = N² + T(N/2) = N² + aN²/4+bN/2+c.

通过识别,我们有

3a/4 = 1
b/2 = 0
c = c.

T(N) = 4N²/3 + c.

使用T(2)= 0

T(N) = 4(N²-4)/3

明显为CCD_ 4。

这是一个简单的数学。复杂度为n^2+(n^2)/4+(n^ 2)/16+…+1.它是(n²*(1+1/4+…)。数学上说无穷级数收敛到4/3(公式为:1/(1-1/4))。

它实际上给出了O(n2)。