【问题标题】: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)。

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多