Java快速幂
当调三个接口修改500条数据花了50分钟+的时候,从来没想过优化算法的我绝望了,从此开始关注算法的时间复杂度,等啥时候遇到内存溢出再去关注空间复杂度吧
时间复杂度一般用T(n)=O(f(n))表达式表示,f(n)数量级排序:1,lgn,n,n lgn,n²,n³......
求幂最简单的方式是一个for循环就搞定啦,此时时间复杂度 f(n)=n,
快速幂:将幂指数b转换为二进制,例:6对应二进制为110,此时ab =a4*a2*a0,时间复杂度为f(n)=lgn
//求a的b次方,普通版快速求幂
public void testFast() {
int a = 2;
int b = 6;
int i=1;
int mi = b;
int r = 1, base = a;
while (b != 0) {
if (b % 2 != 0) {
r *= base;
System.out.println("第"+ i +"次r = "+r);
}
base *= base;
System.out.println("第"+ i +"次base = "+base);
b /= 2;
System.out.println("第"+ i +"次b = "+b);
i++;
}
System.out.println(a+"的"+mi+"次方 = "+r);
}
//位移快速求幂,求a的b次方
public void testPosition() {
int a=2;
int b=6;
int r = 1, base = a;
while (b!=0) {
if ((b & 1)!=0) {
r *= base;
}
base *= base;
b >>= 1;
}
System.out.println(a+"的"+b+"次方 = "+r);
}