c++ - 通过平方时间复杂度求幂

标签 c++ c algorithm big-o

我不明白平方求幂如何导致 O(log n) 乘法。

在我看来,您最终做的不仅仅是 log n 乘法(其中 n 是指数的大小)。

示例:

              power(2,8)
       /                       \
     pow(2,4)        *          pow(2,4)
    /        \                 /        \      
pow(2,2) * pow(2,2)          pow(2,2) * pow(2,2)
   /               \             /              \
 p(2,1)*p(2,1) p(2,1)*p(2,1)  p(2,1)*p(2,1)    p(2,1)*p(2,1)

这是七次乘法,就像常规求幂一样。

以下是我尝试过的 3 种方法:

long pow(int base, int exp)
{
  if(exp == 1)
    return base;
  else
    return base * pow(base, exp-1);
}

long pow2(int base, int exp)
{
  if(exp == 1)
    return base;
  else if(exp == 0)
    return 1;
  else
    if(exp % 2 == 0)
      return pow2(base * base, exp/2);
    else
      return base * pow2(base * base, exp/2) ;
}

long pow3(int base, int exp)
{
    if(exp == 1)
        return base;
    int x = pow2(base,exp/2);
        if(exp%2 == 0)
            return x*x;
        else
            return base*x*x;
}

看起来,一旦递归触底,就会执行相同数量的乘法...

最佳答案

您应该只考虑一个分支,因为您保存了结果并且不重新计算分支。实际上只完成了以下乘法:

              power(2,8)
       /                       \
     pow(2,4)        [*]        pow(2,4)
    /        \                 /        \      
pow(2,2) [*] pow(2,2)        pow(2,2) * pow(2,2)
   /               \             /              \
 p(2,1)[*]p(2,1) p(2,1)*p(2,1)  p(2,1)*p(2,1)    p(2,1)*p(2,1)

关于c++ - 通过平方时间复杂度求幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250132/

相关文章:

c - 如果我们需要按特定顺序打印多线程计算的结果,为什么信号而不是广播有效?

java - 为什么 O(n^2) 与 O(ab) 不同?

用于创建直骨架的 Java 库?

c++ - 从二进制 vector 中获取文本

c++ - (a*b)%m 分割操作数

c - Makefile 多重定义错误

algorithm - 图中的最大流量

c++ - 为什么 move 赋值运算符应该返回对 *this 的引用

if语句中的c++字符串比较

java - 类之间的 Java 中的 JNI 作用域