算法之快速幂
快速幂算法
概念:
- 计算X^N^的最常见的算法是使用N-1次乘法自乘,但是可以使用一种将利用分治思想跟递归结合的算法 更好,效率更高。判断N是偶数还是奇数,如果是偶数的话,我们有X^N^=X^N/2^*X^N/2^,如果为奇数,我们有X^N^=X^(N-1)/2^*X^(N-1)/2^*X,然后在不断的递归并将N等于0和N等于1为递归的基准情形,当N等于1返回X,该算法的时间复杂度为O(logn)
代码:
- 递归:
cpp
long int Pow(long int X,long int N){
if(N==0)
return 1;
if(N==1)
return X;
if(X%2==0){
return Pow(X*X,N/2);
}else{
return Pow(X*X,N/2)*X;
}
}
- 非递归:
cpp
//有些题目数字过大防止溢出会对结果取模
long long quickpow(long long a,long long b,int mod){
long long res=1;
if(b==0) return 1;
while(b){
//b为奇数
if(b%2==1){
res=res*a%mod;
}
b/=2;
a=a*a%mod;
}
return res;
}
-
位运算加速 :假设我们要求a的11次方那么他会分解成8+2+1,那如何将其分解成8+2+1的情况,我们可以将其转换成二进制 ,11的二进制为1011,11=1*2^3^+0*2^2^+1*^1^+1*2^0^,这样我们每次取11的二进制的最后一位这样就能分解成8+2+1了。
cpplong long quickpow(long long a,long long b,int mod){ long long res=1; if(b==0) return 1; while(b){ //b&1就可以等价于b%2==1,如果b为偶数b&1==0,为奇数b&1==1 if(b&1){ res=res*a%mod; } b>>=1; //等价于b/=2 a=a*a%mod; } return res; }
尾言
完整版笔记也就是数据结构与算法专栏完整版可到我的博客进行查看,或者在github库中自取(包含源代码)
- 博客1: codebooks.xyz
- 博客2:moonfordream.github.io
- github项目地址:Data-Structure-and-Algorithms