概率
顾名思义,快速幂就是快速算底数的 n 次幂。其时间复杂度为 O(log₂N),与朴素的 O(N) 相比效率有了极大的提高。
原理
使用求 a 的 b 次方来解释。把 b 转换成二进制数,该二进制数第 i 位的权为 。例如:,11 的二进制为 1011,即 ,因此,可以将 转化为算 。这样原来计算 需要计算 11 次,通过快速幂只需要计算 3 次。从而降低了算法的复杂度。
算法思路
使用位运算。
1)当 b 是奇数时,那么有
2)当 b 是偶数时,那么有
代码实现
最朴素的求幂方法
使用简单的累乘,代码如下,暂时不考虑数据越界问题。
int Pow(int a, int b){
int ans = 1;
for (int i = 0; i<b; i++){
ans *= a;
}
return ans;
}
可以看出,该算法的时间复杂度为 O(n)。
递归版快速幂
int Pow(int a, int b) {
if (0==b) {
return 1;
}
if (b&1) {
//b为奇数
return a*Pow(a, b-1);
} else {
//b为偶数
int t = Pow(a, b/2);
return t*t;
}
}
可以看出,该算法的时间复杂度为 O(logb),也就是 O(logn)。
迭代版快速幂
int Pow(int a, int b) {
int result=1;
int base=a;
while (b) {
if (b&1) {
result *= base;
}
base *= base;
b >>= 1;
}
return result;
}
可以看出,该算法的时间复杂度为 O(logb),也就是 O(logn)。
base *= base解析
因为 ,下一步再乘,就是 ,然后再乘 ,由此可以推导出 。可以发现指数正是 。
再看上面解析的例子 ,这三项就可以完美解决了。