【问题标题】:Why is this code bad to calculate the power (less efficient)?为什么这段代码不利于计算功率(效率较低)?
【发布时间】:2019-09-23 16:24:11
【问题描述】:
class Solution {
   public:
      double myPow(double x, int n) {
         double result=1;
         bool neg=false;

         if(n<0)
         {
            n = -1*n;
            neg=true;
         }
         for(int i =1; i<=n;i++)
         {
            result = x*result;
         }  
         if(neg)
         {
            result = 1/result;
         }
         return result;
      }

};

【问题讨论】:

  • 它需要n 乘法有更快的算法
  • 你可能会做类似pow(x, 4) -> pow(pow(x, 2), 2),而不是x * x * x * x
  • 嗯,它肯定比标准的 pow
  • 在 C++ 中,除了方法之外,您还可以拥有独立的函数
  • 除了已经说过的内容之外,您的代码很糟糕,因为您正在重新发明轮子。 std::pow 可以满足您的需要,除非您有充分的理由自己编写,否则您不应该(尽管我认为将其作为家庭作业任务就足够了;)。

标签: c++ algorithm math


【解决方案1】:

您的方法使用O(N) 运算来计算功率。
可以计算O(log(N)) 操作中的功率。

因此,它不是最有效的。

将其转换为O(log(N))操作的逻辑可以在https://en.wikipedia.org/wiki/Exponentiation_by_squaring看到。

核心思想是

要使这个逻辑起作用,您需要将计算幂的代码移到它自己的函数中,该函数可以是递归的。

      double myPowPositive(double x, int n) {
         // Use the efficient algorithm.
      }

      double myPow(double x, int n) {
         double result=1;
         bool neg=false;

         if(n<0)
         {
            n = -1*n;
            neg=true;
         }

         result = myPowPositive(x, n);

         if(neg)
         {
            result = 1/result;
         }
         return result;
      }

【讨论】:

  • 不是负n吗?
  • @Bathsheba,OP 首先计算正值的幂,然后计算 1/result
  • 确实如此,但需要指出这些琐碎的事情。一样投赞成票。
【解决方案2】:

我没有提供代码,因为这显然是一个家庭作业问题,但我希望能引导你找到正确的解决方案。

问题在于 for 循环的核心需要 n 乘法。执行此操作的常用方法是遍历n 中的位,如果设置了该位,则乘以x,并在每次移动到下一位时平方x。这需要 O(ceil(lg(n))) 次乘法。

【讨论】:

    【解决方案3】:

    除非您知道分母的主要因素,否则您无法真正阻止分母精度的损失。这就是为什么对分母(负指数)尝试这个练习不是一个好的选择,而是首先对分子(正指数)进行尝试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多