权力的时间复杂度()

时间:2011-03-08 10:19:19

标签: c++ c algorithm time-complexity

我实现了这个函数power(),它接受​​两个参数ab并计算 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范围。
问题:如何降低算法的时间复杂度?

6 个答案:

答案 0 :(得分:33)

Squaring的指数化。

enter image description here

非递归实现

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;
    }
}

enter image description here