【问题标题】:Calculating time complexity of a recursive algorithm计算递归算法的时间复杂度
【发布时间】:2011-02-01 02:32:26
【问题描述】:

我正在尝试计算递归算法的时间复杂度,我想我已经差不多了。这是我一直在看的伪代码:

long pow( long x, int n ) {
    if (n == 0)
        return 1;
    if (n == 1)
    return x;
    if(isEven(n))
        return pow(x, n / 2 ) * pow(x, n / 2);
    else
        return x * pow(x * x, n / 2);
} 

isEven 仅确定传递给它的整数是否为偶数,就本示例而言,它以恒定时间运行。

因此,如果 n = 0 或 n = 1,则它运行它具有恒定时间运行,如下所示: f(n) = C0。 但是,当 n > 1 时,它应该像这样运行: 当 n 为偶数时 f(n)= f(n-1) + f(n-1) + C1,当 n 为奇数时 f(n)= f(n-1) + 1,对吗?还是应该是:f(n)= f(n/2) + f(n/2) + C1,当 n 为偶数时,f(n)= f(n/2) + 1,当 n 为奇数时?

我查看了很多示例。 Here 是我觉得很有帮助的一个。我的问题源于当 n 是偶数时有两个递归调用。我不完全确定在这里做什么。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

  • 请允许我欢迎您来到 StackOverflow,并提醒我们通常在这里做的三件事:1) 当您获得帮助时,请尝试在您的专业领域中回答问题 2)Read the FAQs 3)当你看到好的问答时,投票给他们using the gray triangles,因为系统的可信度是基于用户通过分享他们的知识而获得的声誉。还记得接受更好地解决您的问题的答案,如果有的话,by pressing the checkmark sign
  • 这个新手问题问得很好。
  • 您是否有意使用相同的参数对pow(x, n / 2) 进行两次递归调用?你可以只做long r = pow(x, n / 2); return r * r;,这样不仅效率更高,而且分析更简单。

标签: algorithm big-o time-complexity


【解决方案1】:

看看Master Theorem。您可以将其视为“分而治之”的算法。

最终结果是,两个递归调用到位后,您最终会得到最坏情况的 O(n) 运行时。例如。 pow(x, 4) 调用 pow(x, 2) 两次, pow(x, 1) 调用四次;通常,2 的幂将导致 n*2-1 次调用。

另请注意,只需调用一次 pow(x, n/2) 并在该分支中对结果进行平方,算法变为 O(log n)。

【讨论】:

  • 谢谢。我一直在研究 Master Theorem,我正试图围绕它来思考……我想我得再考虑一下!
  • 不要感觉太糟糕——这是您在运行时分析您看到的大多数常见案例代码时需要的最困难的部分之一。
【解决方案2】:

让我们将 f(m) 定义为它为您提供大小为 m 的问题的操作数。 “问题”当然是求幂(pow),例如x^npow(x,n)。如果我更改 x,long pow( long x, int n ) { 函数不需要做更多或更少的工作。因此,问题求幂的大小不取决于 x。然而,它确实取决于 n。假设 2^4 的大小为 4,而 3^120 的大小为 120。(如果您看到 2^4=2*2*2*23^120=3*3*3*3*..*3,这很有意义)问题大小因此等于第二个参数 n。如果你愿意,我们可以说问题大小是 2*log(n),但那太愚蠢了。

现在我们有 f(m) 是计算任意 x 的 pow(x,m) 的操作数。因为pow(x,m) 正是尺寸 m 的问题。 所以,如果我们有pow(x,y),那么根据定义,操作数就是f(y)例如,pow(3,3*m/2)f(3*m/2) 操作。

最后,我们来统计一下操作

long pow( long x, int n ) {
    if (n == 0)  //1
        return 1;
    if (n == 1)  //1
    return x;
    if(isEven(n)) //1
        return pow(x, n / 2 ) * //that is f(n/2), y=n / 2
                 pow(x, n / 2); //also f(n/2)
    else
        return x * pow(x * x, n / 2); //1+1+f(n/2)
} 

综合起来:f(n) = 2*f(n/2) + c1(偶数)和f(n) = f(n/2) + c2(奇数)。如果您只对最坏的情况感兴趣,那么请注意,奇怪的情况工作量较小。因此 f(n) 在上面是偶数情况:f(n) <= 2*f(n/2)+c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多