博客
关于我
程序员必学:快速幂算法
阅读量:472 次
发布时间:2019-03-06

本文共 1767 字,大约阅读时间需要 5 分钟。

快速幂算法是程序员必备的技能之一,了解它的实现方法和原理非常重要。以下将从基础到高级深入讲解快速幂的实现方法,并结合实际案例进行分析。

快速幂的重要性

快速幂算法能够在O(log n)的时间复杂度内完成n次幂的计算,这对于处理大数运算尤为重要。传统的乘法算法时间复杂度为O(n),在处理非常大的指数时效率低下。快速幂算法通过将指数分解为二进制形式,利用乘法的平方性质,显著提升了计算效率。

快速幂的递归实现

递归实现的快速幂算法基于以下公式:

x^n = (x^(n/2))^2 × (如果n是奇数,则再乘以x)

递归实现的代码示例如下:

int fastPower(int x, int n) {    if (n == 0) return 1;    int result = fastPower(x, n >> 1);    result *= result;    return (n & 1) == 0 ? result : result * x;}

递归实现的优点是代码简洁,逻辑清晰。每次递归将指数n减半,直到n变为0。这种方法的时间复杂度为O(log n),空间复杂度为O(log n)(递归深度)。

快速幂的非递归实现

非递归实现通过迭代的方式逐步计算幂次,避免了递归的潜在栈溢出问题。代码示例如下:

int fastPower(int x, int n) {    int result = 1;    while (n != 0) {        if ((n & 1) == 1) {            result *= x;        }        x *= x;        n >>= 1;    }    return result;}

非递归实现的优点是无限循环空间,适合处理较大的指数值。同时,通过检查n的二进制位是否为1,来决定是否需要将当前结果乘以x。

实际案例分析

以计算3^21为例,非递归实现的执行流程如下:

  • 初始:result=1, x=3, n=21(二进制为10101)
  • 进入循环:
    • n的最后一位为1,result=1×3=3,x=3×3=9,n=1010
    • n的最后一位为0,result=3,x=9×9=81,n=101
    • n的最后一位为1,result=3×81=243,x=81×81=6561,n=10
    • n的最后一位为0,result=243,x=6561×6561=43046721,n=1
    • n的最后一位为1,result=243×43046721=10460353203,x=43046721×43046721=1853020188851841,n=0
  • 最终结果为10460353203。

    Leetcode应用

    Leetcode上的第50号问题“矩阵的最短路径”可以通过快速幂算法来优化。以下是我的Java实现:

    // 递归实现double myPow(double x, int n) {    if (n == 0) return 1;    if (n == -1) return 1 / x;    double half = myPow(x, n >> 1);    half *= half;    return ((n & 1) == 1) ? half * x : half;}// 非递归实现double myPow(double x, int n) {    long y = n < 0 ? -((long) n) : n;    double result = 1.0;    while (y > 0) {        if ((y & 1) == 1) {            result *= x;        }        x *= x;        y >>= 1;    }    return n < 0 ? 1 / result : result;}

    更多练习

  • 矩阵快速幂求斐波那契数列

    利用矩阵快速幂算法,快速计算斐波那契数列的第n项。

  • 快速幂模运算

    设计一个算法,计算x^y % z的结果。

    • 输入:x、y(≥0)、z(≠0)
    • 输出:(x^y) % z
  • 欢迎在留言区留言交流,共同探讨更多算法奥秘!

    转载地址:http://ethyz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C内存管理教程和原理剖析(三)
    查看>>
    Objective-C实现 Greedy Best First Search最佳优先搜索算法(附完整源码)
    查看>>
    Objective-C实现 jugglerSequence杂耍者序列算法 (附完整源码)
    查看>>
    Objective-C实现 lattice path格子路径算法(附完整源码)
    查看>>
    Objective-C实现1000 位斐波那契数算法(附完整源码)
    查看>>
    Objective-C实现2 个数字之间的算术几何平均值算法(附完整源码)
    查看>>
    Objective-C实现2d 表面渲染 3d 点算法(附完整源码)
    查看>>
    Objective-C实现2D变换算法(附完整源码)
    查看>>
    Objective-C实现3n+1猜想(附完整源码)
    查看>>
    Objective-C实现3n+1猜想(附完整源码)
    查看>>
    Objective-C实现9x9乘法表算法(附完整源码)
    查看>>
    Objective-C实现9×9二维数组数独算法(附完整源码)
    查看>>
    Objective-C实现A*(A-Star)算法(附完整源码)
    查看>>
    Objective-C实现A-Star算法(附完整源码)
    查看>>
    Objective-C实现abbreviation缩写算法(附完整源码)
    查看>>
    Objective-C实现ABC人工蜂群算法(附完整源码)
    查看>>
    Objective-C实现activity selection活动选择问题算法(附完整源码)
    查看>>
    Objective-C实现AC算法(Aho-Corasick) 算法(附完整源码)
    查看>>
    Objective-C实现adaboost算法(附完整源码)
    查看>>
    Objective-C实现Adler32算法(附完整源码)
    查看>>