我有这个功能:
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!)吗?
答案 0 :(得分:0)
我将假设num
和count
均为非负数。运行时T(m,n),其中m,n为num
和count
(即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中的双指数差。