函数示例的Big-O

时间:2018-10-04 17:01:39

标签: big-o code-complexity

我有这个功能:

function void myFoo(int num, int count) { 
    if (num == 0) return;

    for (int x = 0; x < count; x++) {
        for (int y = x; y < count; y++) {
            for (int z = y; z < count; z++) {
                //O(1) computation
            }
        }
        num--;
        myFoo(num, count);
    }
}

我只是想知道此功能的复杂性, 是Big-o(n!)吗?

1 个答案:

答案 0 :(得分:0)

我将假设numcount均为非负数。运行时T(m,n),其中m,n为numcount(即log({num),log(count)的大小为由

给出
T(m, n)=sum(T(log(2^m-1), n)+sum(sum(O(1), z=y..2^n-1), y=x..2^n-1), x=0..2^n-1)

简化为

T(m, n)=2^n*T(log(2^m-1), n)+2^n/3+2^(2n-1)+2^(3n-1)/3

给予

T(m, n)=2^n*T(log(2^m-1), n)+O(2^(3n))

观察到这不依赖于m,除了将它递归应用2 ^ m次,我们得到

T(m, n)=sum(2^(k*n)*O(2^(3n)), k=0..2^m-1)

相同
T(m, n)=O((8^n*(-1 + 2^(2^m*n)))/(-1 + 2^n))=O(2^((2^m+2)n))=O(2^(2n)*2^(2^m*n))

因此,将输入作为每个数字的大小进行度量(并概括为允许任意大小的整数),其复杂度要比m中的双指数差。