问题描述
是找到给定数字幂的算法。递归后的语句将如何影响复杂性?
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
是任何非负整数。
因此,我们可以说,当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 + 1
或lg(n) + 1
。
因此,它是O(lg(n) + 1)
,或者我们可以说是O(lg(n))
。