概率
顧名思義,快速冪就是快速算底數的 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解析
因爲 ,下一步再乘,就是 ,然後再乘 ,由此可以推導出 。可以發現指數正是 。
再看上面解析的例子 ,這三項就可以完美解決了。