快速幂(Exponentiation by squaring,平方求幂)是一种简单而有效的小算法,它可以以Olog(n)的时间复杂度计算乘方。快速幂不仅本身非常常见,而且后续很多算法也都会用到快速幂。例如8的10次方
方法1:最朴素的想法,88=64,648=,… 一步一步算,共进行了9次乘法。
这样算无疑太慢了,尤其对计算机的CPU而言,每次运算只乘上一个个位数,无疑太屈才了。这时我们想到,也许可以拆分问题。
方法2:先算8的5次方,即88888,再算它的平方,共进行了5次乘法。
但这并不是最优解,因为对于“7的5次方”,我们仍然可以拆分问题。
方法3:先算88得64,则8的5次方为6464*8,再算它的平方,共进行了4次乘法。
模仿这样的过程,我们得到一个在 [Olog(n)] 时间内计算出幂的算法,也就是快速幂。
递归快速幂
无非是一个二分的思路。我们很自然地可以得到一个递归方程:
计算a的n次方,如果n是偶数(不为0),那么就先计算a的n/2次方,然后平方;如果n是奇数,那么就先计算a的n-1次方,再乘上a;递归出口是a的0次方为1。
非递归快速幂
int qpow(int a, int n){
int ans = 1;
while(n){
if(n&1) //如果n的当前末位为1
ans *= a; //ans乘上当前的a
a *= a; //a自乘
n >>= 1; //n往右移一位
}
return ans;
}
本文深入讲解了快速幂算法,一种高效计算乘方的算法,时间复杂度为O(log n)。文章介绍了递归和非递归两种实现方式,并通过实例说明了如何减少乘法操作,提高计算效率。
366

被折叠的 条评论
为什么被折叠?



