【问题标题】:How to find the time complexity of a recursive method?如何找到递归方法的时间复杂度?
【发布时间】:2023-01-20 22:15:53
【问题描述】:
double expRecursive(double x, int n) {
if (n <= 4) {
return expIterativ(x, n);
}
return expRecursive(x, n/2) *
expRecursive(x, (n + 1)/2);
}
所以我要处理的问题是如何使用大 O 表示法来编写此方法的时间复杂度。
这是我到目前为止所做的。我不确定它是否正确,但让我解释一下。我得到 T(n)= 2 T(n/2) + 1 for n>4 因为我们有 2 个递归调用和其他操作。但是当谈到 n<=4 时,这就是我卡住的地方。有一个递归调用,这意味着它甚至会是 T(n)= T(n/2)+1 之类的东西。但这甚至感觉不对,如果有人能帮助我,我将不胜感激。
【问题讨论】:
标签:
java
annotations
time-complexity
big-o
complexity-theory
【解决方案1】:
出于我们的目的假设一个常数 x(即,我们对作为 x 的函数的增长率不感兴趣),expIterative 也只是 n 的函数,并且仅在 n <= 4 的情况下被调用。有一些最大的expIterative 在 x 和 n 上运行所需的时间 t*,其中 n 从 0 到 4。我们可以简单地使用最大时间 t* 作为常数,因为可以作为输入发送的 n 的范围是有界的。
double expRecursive(double x, int n) {
if (n <= 4) { // a+b
return expIterativ(x, n); // c+t*
}
return expRecursive(x, n/2) * // c+T(n/2)
expRecursive(x, (n + 1)/2); // d+T((n+1)/2)
}
正如您所指出的,我们可以做出 n 是偶数的简化假设,只需担心这种情况。如果我们假设 n 是 2 的幂,那就更容易了,因为那时所有的递归调用都将针对偶数。
我们得到
T(n) <= 2T(n/2) + (a+b+2c+d+t*)
最后括号里的东西只是常数之和,所以我们可以把它们加在一起,称结果为k:
T(n) <= 2T(n/2) + k
我们可以在这里写出一些术语:
n T(n)
4 t*
8 2t* + k
16 4t* + 2k + k
32 8t* + 4k + 2k + k
...
2^n 2^(n-2)t* + 2^(n-2)k - k
= (2^n)(t* + k)/4 - k
所以对于输入 2^n,它花费的时间与 2^n 成正比。这意味着 T(n) = O(n)。