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);
}
本文介绍了一种使用Java实现的快速幂算法,通过将幂指数转换为二进制形式来优化传统幂运算的时间复杂度,从线性的O(n)降低到对数级别的O(lgn)。文章提供了两种实现方式:一种是基于条件判断的传统方法,另一种是利用位移操作的高效方法。
1947





