algorithm - 计算递归算法的时间复杂度

标签 algorithm big-o time-complexity

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

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,对吗?或者应该是:当 n 为偶数时,f(n)= f(n/2) + f(n/2) + C1;当 n 为奇数时,f(n)= f(n/2) + 1?

我看了很多例子。 Here我发现这非常有帮助。我的问题源于当 n 为偶数时有两次递归调用。我不完全确定在这里做什么。如果有人能指出我正确的方向,我将非常感激。

最佳答案

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

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

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

关于algorithm - 计算递归算法的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858316/

相关文章:

algorithm - 分组相似集算法

eclipse - Landau notation (ide) 工具支持

c - 优化 C 代码 -> CodeChef 求解时间超出

java - 如何将 BST 中的删除方法从递归切换为迭代?

algorithm - Boruvka 和 Kruskal 在寻找 MST 方面的区别

c - 简单地?找到没有敌人的游戏屏幕部分的算法

c++ - 如何评估代码的复杂性 (Big-O)?

java - java 中 3x3 多维数组的大 O 表示法是什么?

algorithm - 以特殊方式设置不相交?

c - 矩形矩阵复杂度