我写了一小段代码来找到数字的力量
任何人都可以告诉我如何找到此代码的时间复杂度。 这段代码的时间复杂度是多少? 并且它是一种有效的方法来查找数字的权力
代码是:
public static void main(String[] args) {
System.out.println(optPower(7, 15));
}
static int optPower(int x, int y) {
// divide in buckets
if (y == 0) {
return 1;
}
if (y == 1) {
return x;
}
if (y == 2)
return x * x;
int tmpY;
boolean isYmodified = false;
if (y % 2 == 0) {
tmpY = y;
} else {
tmpY = y - 1;
isYmodified = true;
}
int biggestBucket = 2;
int n = biggestBucket;
/*
* tmpY/4 , here '4' can be used as a tweking parameter to size the
* buckets
*/
while (tmpY % n == 0 && tmpY / 4 >= n) {
biggestBucket = n;
n = n * 2;
}
int res = 1;
for (int i = 0; i < biggestBucket; i++) {
res = res * x;
}
int mul = res;
for (int j = 1; j < tmpY / biggestBucket; j++) {
mul = mul * res;
}
return isYmodified ? mul * x : mul;
}
根据要求,我添加了更多注释,以便更清楚地解释算法。
如果我想计算5
加注到16
第1步: -
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
上述方法中的x=5
,y=16
如果y
为奇数,我们会在最终结果中多加x
并将tmpY
指定为y-1
以使其均匀
so noOfBuckets = 4 because of below code
while (tmpY % n == 0 ) {
biggestBucket = n;
n = n * 2;
}
that is
16/(2 raise to 2)
step 2:-
divide 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 into 4 buckets
bucket1 :- 5,5,5,5
bucket2 :- 5,5,5,5
bucket3 :- 5,5,5,5
bucket4 :- 5,5,5,5
第3步: -
仅计算存储桶1,并将此存储桶的结果用于剩余存储桶
桶1的结果= 625 = 5*5*5*5
第4步:在这里输入代码
最终结果为bucket1*bucket1*bucket1*bucket1
,即625 * 625 * 625 * 625
,即5
加注到16
然后我们避免在桶2,3,4中进行迭代,并直接使用桶1中的值来获得最终结果。
答案 0 :(得分:2)
square-and-multiply方法需要时间O(log n):
function power(b, e)
if (e == 0) return 1
if (e is even) return power(b*b, e/2)
/* e is odd */ return b * power(b, e-1)
答案 1 :(得分:0)
假设你的代码使用2的幂以外的指数,那么你的代码确实在O(log n)
时间内运行