递归函数的时间复杂度find(n)

时间:2015-09-24 16:32:30

标签: c algorithm time-complexity

void find (int n) {
    if (n < 2) return;
    else {
        sum = 0;

        for (i = 1; i <= 4; i++) find(n / 2); 
        for (i = 1; i <= n*n; i++)
            sum = sum +1;
    }
}

假设除法运算需要恒定时间,sum是一个全局变量。 find(n)时间复杂度是什么?

据我说:首先是循环运行4 log n次,第二次循环运行n^2次。 所以总时间复杂度= O(4 log n + n^2) = O(n^2)

3 个答案:

答案 0 :(得分:4)

T(n) = 4 * T(n/2) + O(n^2)
a = 4, b = 2, f(n) = n^2
f(n) = O(n^c log^k(n)) , c = 2, k = 0
logb(a) = log2(4) = 2, c = logb(a)
T(n) = Theta(n^(logb(a))log^(k+1)n) = Theta(n^2*log^1(n)) = Theta(n^2*log(n))

主定理的案例2。 https://en.wikipedia.org/wiki/Master_theorem

答案 1 :(得分:1)

每次调用自身时,第一个循环都会执行O(log(n))次。 返回后,每次调用都将调用一个O(n ^ 2)循环。

因此,O(n^2 log(n))

答案 2 :(得分:0)

你是对的。 n^2 + (n/2)^2 + (n/4)^2 + ..在O(n ^ 2)中,因为它小于2 *(n ^ 2)。您可以用较大的方块填充所有较小的方块。

即使将O(n)作为最后一个循环,这也会成立。

例如

for (i = 1; i <= 4; i++) find(n / 2); 
for (i = 1; i <= n; i++)
    sum = sum +1;

具有O(n)的复杂性