这个 power() 函数的复杂性是什么?

what is the complexity of this power() function?

这是求给定数的幂的算法。如果有的话,递归之后的语句将如何影响复杂性?

int power(int b, int n){
 if (n == 0)
    return 1;
 else {
    int p = power(b, n/2);
    if (n % 2 == 0) 
        return p * p;
    else 
        return b * p * p;
 }
}

因为,您在每一步将 n 除以 2,算法将运行直到 n 达到 0。我们可以看到发生了什么:

n1 = n / 2
n2 = n1 / 2 = (n / 2) / 2 = n / 4 = n / (2^2)
n3 = n2 / 2 = n / 8 = n / (2^3)
...
...

它的运行时间与 n >= (2^x) 一样长,其中 x 是任何 non-negative 整数。

所以,我们可以说,当 2^x > n 时,它停止(其中 x 是可能的最小整数,2^x > n)。

现在,我们可以写

2^k = n, // where k is a non-negative integer
or, lg(2^k) = lg(n) // here, 'lg' means 2-based log
or, k = lg(n)

因此,x(for which it stops running) 的最小可能值为 k + e, where e is a very small number,但当然,我们正在考虑 integer here(cause, no of steps)。所以,我们可以写 x = k + 1.

因此,算法运行的步数为 x(考虑到乘法的复杂性常数)等于 k + 1lg(n) + 1

所以,它是 O(lg(n) + 1) 或者,我们可以说,O(lg(n))