我实现了这个函数power()
,它接受两个参数a
和b
并计算 b 。
typedef long long int LL;
LL power(int a,int b)
{
int i = 1;
LL pow = 1;
for( ; i <= b ; ++i )
pow *= a;
return pow;
}
鉴于: b 属于long long int
范围。
问题:如何降低算法的时间复杂度?
答案 0 :(得分:33)
Squaring的指数化。
非递归实现
LL power(int a, int b)
{
LL pow = 1;
while ( b )
{
if ( b & 1 )
{
pow = pow * a;
--b;
}
a = a*a;
b = b/2;
}
return pow;
}
此算法需要 log 2 b 方形,最多 log 2 b 乘法。
运行时间 O(log b)
答案 1 :(得分:6)
答案 2 :(得分:4)
我建议:如果你真的需要更快的功能(长双),请使用pow()函数,或者为自己考虑你的功课。
对于任意精度:请参阅GMP lib http://gmplib.org/manual/Integer-Exponentiation.html#Integer-Exponentiation
答案 3 :(得分:4)
通过平方的指数并不能在所有情况下给出最小的乘法次数。寻找“附加链”,“Brauer链”,“Hansen链”和“Scholz猜想”。
答案 4 :(得分:4)
使用正方形求幂。那就是如果我们需要a ^ b,我们检查b是否是偶数,如果b是偶数,我们找到(a^2)^(b/2)
,否则我们找到a*((a^2)^(b/2))
。这可能不是最好的算法,但它比线性算法更好。
int Power(int a, int b)
{
if (b>0)
{
if (b==0)
return 1;
if (a==0)
return 0;
if (b%2==0) {
return Power(a*a, b/2);
}
else if (b%2==1)
{
return a*Power(a*a,b/2);
}
}
return 0;
}
答案 5 :(得分:3)
这是Java代码的递归实现 使用Exponentiation by squaring
获得具有O(log n)复杂度的n的幂int ans=1;
public int myTwoPower(int n){
if(n<=0)
return 1;
if(n%2 !=0){
return myTwoPower(n-1)*2;
}
else{
ans = myTwoPower(n/2);
return ans * ans;
}
}