美文网首页
快速幂算法

快速幂算法

作者: wayyyy | 来源:发表于2017-10-17 23:25 被阅读0次

快速幂算法,可以将时间复杂度从O(N)降为O(log2N)。

比如要算2^n (n>0),最简单的方法是:

int result = 0;
for (int i = 0; i < n; i++)
    result *= 2;

时间复杂度是O(N)。

当n为偶数:
2^n = 2^(n/2) * 2^(n/2)
2^(n/2) = 2^(n/4) * 2^(n/4)
2^(n/4) = 2^(n/8) * 2^(n/8)
......

当n为奇数:
2^n = 2^(n/2) * 2^(n/2) * 2
2^(n/2) = 2^(n/4) * 2^(n/4)
2^(n/4) = 2^(n/8) * 2^(n/8)

推广为:
base^n = base^(n/2) * base^(n/2); 
base^n = base * base^((n-1)/2) * base^((n-1)/2);
......

这样分解下去,就可以把时间复杂度降为O(log2N)

现在可以用这个方法来实现pow函数:

double tiny_pow(double base, int n) 
{
     // 0的0次方极限趋近于1. 0^-1,0^-2会引起CPU异常,所以不作处理
    if (equal(base, 0.0) && n == 0)
        return 0.0;

    unsigned int absN = ( n > 0 ? (unsigned int)n : abs(n) );
    
    double result = powWithUnsignedN(base, absN); 
    if (n < 0)
        result = 1.0 / result;
    
    return result;
}

double powWithUnsignedN(double base, unsigned int n)
{
    if (n == 0)  return 1;

    if (n == 1)  return base;  // 也是递归开始回溯的地方

    double result = powWithUnsignedN(base, n >> 1);
    result *= result ;
     
    if (n & 1)      // n为奇数
        result *= base;
    
    return result ; 
}

bool equal(double num1, double num2) 
{        
    // |num1 - num2| < 0.0000001
    if (-0.0000001 < (num1 - num2) && (num1 - num2) < 0.0000001) 
        return true;
    else
        return false;
}

相关文章

  • 模板 | 整数快速幂 & 快速幂取模

    快速幂: 所谓的快速幂,其目的是为了快速求幂,将时间复杂度从朴素算法的降到。 假如现在要求 ,按照朴素算法,就是将...

  • WOJ-315-高级机密

    主要参考了这篇文章:快速幂 蒙格马利算法 蒙哥马利(Montgomery)幂模运算是快速计算a^b%k的一种算法,...

  • 2018-07-09-快速幂

    参考:算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现 - CSDN博客

  • 快速幂算法

    快速幂算法,可以将时间复杂度从O(N)降为O(log2N)。 比如要算2^n (n>0),最简单的方法是: 时间复...

  • 快速幂算法

    原理 例子 计算。可以看到,原本需要12次乘法的计算,现在只需要5次乘法了。 分析 将的上标全写为二进制 可以看到...

  • 快速幂算法

    求解一个数的 n次方,我们一般直接累乘 n次,就像下面的代码一样: 但是这种方法只能用于指数 n比较小的情况,如果...

  • 快速幂

    快速幂 如果要我们求解,正常的做法往往是的算法,当数字很大的时候会耗费较多的时间,现在我们采用快速幂,可以将时间复...

  • Java 算法-快速幂

      说实话,自己是第一次接触到快速幂这种东西,觉得有必要记录下来。 题意: 样例: 挑战: 1.解题思路   在介...

  • Leetcode【372、1131】

    问题描述:【Math】372. Super Pow 解题思路: 快速幂算法。计算 a^b mod 1337,a 是...

  • (矩阵)快速幂

    快速乘法: 快速幂: 矩阵快速幂:

网友评论

      本文标题:快速幂算法

      本文链接:https://www.haomeiwen.com/subject/bywjuxtx.html