这个算法的Big-O复杂性

时间:2015-11-20 09:19:54

标签: c++ algorithm recursion big-o

CODE:

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?

3 个答案:

答案 0 :(得分:3)

你是对的,所以大(O)是n ^ 2,因为系列的总和n ^ 2 +(n ^ 2)/ 4 +(n ^ 2)/ 16 + ... + 1从未超过2n个^ 2

答案 1 :(得分: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

显然是O(N²)

答案 2 :(得分:0)

这是简单的数学。复杂度为n ^ 2 +(n ^ 2)/ 4 +(n ^ 2)/ 16 + ... + 1.它是(n 2 *(1 + 1/4 + ...))。数学表明无限系列收敛到4/3(公式为:1 /(1 - 1/4))。

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