我的Power方法的运行时复杂度

时间:2017-07-27 04:07:15

标签: algorithm recursion big-o pow

这是我对电源方法的实现。

  1. 如果功率是偶数,我将基数平方,然后除以 2点的力量。
  2. 如果功率是奇数,我用递归方式运行方法 功率降低1,以获得偶数,并乘以 基数的结果,以减少一个人的权力。

  3. 电源为1时达到基本情况,结果为0.

  4. 我的问题是,这种方法的时间复杂度是多少?因为,我们在每次迭代时将功率除以2,它是否登录到基数2?

          double myPow(double base, int pow) {
          if(pow == 0)
              return 1;
    
          if(pow < 0)
              return 1/base * 1/myPow(base, (pow*-1)-1);
    
          if(pow %2 == 1)
              return base * myPow(base, pow-1);
          else
              return myPow(base*base, pow/2);
        }
    

2 个答案:

答案 0 :(得分:3)

是的,复杂性是对数的。您的方法基本上是exponentiation by squaring

平方的数量等于pow的二进制扩展中的零的数量,并且乘法的数量等于pow的二进制扩展中的1的数量,因此操作的总数大约是pow的有效位的数量,log2(pow)

答案 1 :(得分:0)

你认为这种权力方法是O(log n)是正确的。请注意,我没有包含此日志的基础(在本例中为base 2),这是因为all logs differ by a constant

MBo上面简要说明了为什么会出现这种情况,但我想详细说明为什么会出现这种情况。

首先,我们需要确定此方法的运行时依赖于什么。请注意,无论基数是多少,如果功率相同,运行时将是相同的(给予或采取无关紧要的随机性)。但是,当功率发生变化时,运行时将根据MBo所述的有效位数进行更改。

但这是什么意思?好吧,考虑这两种情况(以二进制方式读取这些赋值,我在这里使用psuedocode):

case 1:
pow = 1000

case 2:
pow = 1111

您会注意到这两种情况是给定位数的最佳和最差情况。第一个允许我们整齐地除以2,直到我们达到基本情况,另一个让我们在除以2之前减去1,导致操作次数的两倍。

由于大O是关于最坏情况的时间复杂度,让我们更深入地看一下最坏的情况(考虑到第一个整齐地引导我们记录n时间)。我们必须执行与最佳情况相同数量的除法,但每个除法都以减法为前缀。这意味着我们最终得到2 * log n时间。但是,正如我上面所说的那样,大O并不关心常量,所以我们渐渐地以O(log n)时间结束。这意味着有效位数(或数字所具有的位数)限制了需要执行的操作数(位&lt; = ops&lt; = 2 *位)。

我希望这可以为你提出的问题提供更多的启示。如果你没有得到任何其他东西,请记住大O不关心常数,无论他们在哪里。