递归算法的时间复杂度

时间:2011-04-19 04:37:44

标签: c algorithm time-complexity

有人可以向我解释如何计算以下递归代码的复杂性:

long bigmod(long b, long p, long m) {
    if (p == 0)
        return 1;
    else
    if (p % 2 == 0)
        return square(bigmod(b, p / 2, m)) % m;
    else    
        return ((b % m) * bigmod(b, p - 1, m)) % m;
}

4 个答案:

答案 0 :(得分:2)

这是 O(log(p)),因为你每次除以2或减去除以2然后除以2,所以最坏的情况是真的需要O(2 * log(p) ) - 一个用于除法,一个用于减法。

请注意,在此示例中,最坏情况和平均情况应该是相同的复杂性。

答案 1 :(得分:2)

如果你想对它更正式,那么你可以写一个递归关系并使用Master定理来解决它。 http://en.wikipedia.org/wiki/Master_theorem

答案 2 :(得分:0)

它在O(log n)

中运行

在函数内部没有昂贵的操作(因为我比平方或修改更昂贵。没有循环等),所以我们几乎只计算函数调用。

最好的情况是2的幂,我们需要准确的log(n)调用。

最糟糕的情况是,我们在每次其他通话中都会得到一个奇数。这只能使我们的电话加倍。乘以常数因子,不会渐近变差。 2*f(x) is still O(f(x))

O(logn)

答案 3 :(得分:0)

是o(log(N))base 2,因为除以2