快速幂
【快速幂】
快速幂就是快速算出底数的n次幂,它的复杂度为log(n),相比朴素的O(n)有了极大的提高,故因此得名
蛮力算法
以求 2n 为例,最直接的办法就是将n个2相乘,即:
\[2 \times 2 \times2 \times2 \times2 \times.........{有n个2} = 2^n
\]
时间复杂度为 O(log)
#include<iostream>
using namespace std;
// 蛮力算法递归版
int pow2_brute_recursive(int n)
{
if( n == 0)
return 1;
return 2*pow2_brute_recursive(n-1);
}
// 蛮力算法迭代版
int pow2_brute_iteration(int n)
{
int res = 1;
while(n--){
res *= 2;
}
return res;
}
int main()
{
cout<<"pow2_brute_recursive(8) = "<<pow2_brute_recursive(8)<<endl;
cout<<"pow2_brute_iteration(8) = "<<pow2_brute_iteration(8)<<endl;
return 0;
}
快速幂相乘
原理:
\[pow2(n)=
\begin{cases}
n\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad(若n<=1)\\
pow2(\lfloor n/2 \rfloor)^2\times2 \quad\quad\quad\quad\quad(n>0\quad and\quad odd)\\
pow2(\lfloor n/2 \rfloor)^2\quad\quad\quad\quad\quad\quad\quad(n>0\quad and\quad even)
\end{cases}
\]
#include<iostream>
using namespace std;
/*
快速幂,时间复杂度O(logn)
求 2^n
*/
int square(int n)
{
return n*n;
}
//递归版本
int pow2_recursive(int n)
{
if(n==0)
return 1;
return (n&1)?square(pow2_recursive(n>>1))<<1
:square(pow2_recursive(n>>1));
}
//迭代版本
int pow2_iteration(int n)
{
int pow = 1;
int p=2;
while(0 < n)
{
if(n&1)
pow *=p;
p *= p;
n >>= 1;
}
return pow;
}
/*
快速幂迭代版,时间复杂度O(logn)
求 a^n
*/
int pow(int a,int n)
{
int pow = 1;
int p = a;
while(0 < n)
{
if(n&1)
pow *= p;
p *= p;
n >>= 1;
}
return pow;
}
int main()
{
cout<<"pow2_recursive(5): "<<pow2_recursive(5)<<endl;
cout<<"pow_iteration(5): "<<pow_iteration(5)<<endl;
cout<<"pow(5,3): "<<pow(5,3)<<endl;
return 0;
}