递归函数的时间复杂度

时间:2021-01-20 22:54:37

标签: java algorithm recursion time-complexity big-o

我在用 Big-O 表示法确定这个递归函数的时间复杂度时遇到了一些麻烦。

double expRecursive(double x, int n) {
    if (n <= 4) {
        return expIterativ(x, n);
    }

    return expRecursive(x, n/2) *
           expRecursive(x, (n + 1)/2);
}

(expIterative 方法的时间复杂度为 O(n))

expRecursive() 的递推关系是 T(n) = 2T(n/2) + n 吗?

如果是这种情况,我想在应用主定理后 T(n) = O(nlogn)?

我最大的问题是想出正确的递推关系...

1 个答案:

答案 0 :(得分:0)

要得到递推关系,先对代码进行注释是有帮助的:

double expRecursive(double x, int n) {
    if (n <= 4) {
        return expIterativ(x, n);       // O(1) since n is bounded
    }

    return expRecursive(x, n/2)         // T(n/2)
           *                            // O(1)
           expRecursive(x, (n + 1)/2);  // T(n/2)
}

所以递推关系是

T(n) = O(1),              for 0 <= n <= 4
T(n) = 2 * T(n/2) + O(1), for n > 4

其中有解决方案 T(n) ∈ Ө(n)