power() 的时间复杂度

发布于 2024-10-20 14:07:54 字数 341 浏览 4 评论 0原文

我实现了这个函数 power(),它接受两个参数 ab 并计算 ab

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

给定:ab落在long long int范围内。
问题:如何降低算法的时间复杂度?

I implemented this function power() which takes two arguments a and b and computes ab.

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

Given : ab falls in the range of long long int.
Problem : How to reduce the time complexity of my algorithm?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

千里故人稀 2024-10-27 14:07:54

通过平方求幂。

在此处输入图像描述

非递归实现

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

该算法需要 log2b< /strong> 平方和最多 log2b 乘法。

运行时间O(log b)


Exponentiation by Squaring.

enter image description here

A non-recursive implementation

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

This algorithm requires log2b squarings and at most log2b multiplications.

The running time is O(log b)


梦幻的味道 2024-10-27 14:07:54

通过平方求幂并不能在所有情况下给出最小乘法次数。寻找“加法链”、“布劳尔链”、“汉森链”和“肖尔茨猜想”。

Exponentiation by squaring does not give the minimal number of multiplications in all cases. Look for "addition chains", "Brauer chains", "Hansen chains", and "Scholz conjecture".

星軌x 2024-10-27 14:07:54

我建议:如果您确实需要更快的函数(使用 long double ),请使用 pow() 函数,或者自己考虑一下您的作业。

对于任意精度:请参阅 GMP 库
http://gmplib.org/manual/Integer-Exponentiation.html#Integer-Exponentiation

I would suggest: Use the pow() function if you really need a faster function (with long double ) or think about your homework for yourself.

For arbitrary precision: See the GMP lib
http://gmplib.org/manual/Integer-Exponentiation.html#Integer-Exponentiation

喵星人汪星人 2024-10-27 14:07:54

使用平方求幂。也就是说,如果我们需要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;
}

Use exponentiation by squares. That is if we need a^b, we check if b is even, if b is even, we find (a^2)^(b/2), else we find a*((a^2)^(b/2)). This may not be the best algorithm, but it is better than the linear algorithm.

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;
}
長街聽風 2024-10-27 14:07:54

下面是Java代码的递归实现
使用 通过平方求幂 计算 2 的 n 次方,复杂度为 O(log 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;
    }
}

在此处输入图像描述

Here is the recursive implementation of Java code
for 2 to the power of n with O(log n) complexity using Exponentiation by squaring

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文