美文网首页
2.13 实战:快速设计一个高效的求a的n次幂的算法

2.13 实战:快速设计一个高效的求a的n次幂的算法

作者: Aurochsy | 来源:发表于2019-03-23 16:14 被阅读0次

Chapter2: 时间复杂度分析、递归、查找与排序

13. 实战:快速设计一个高效的求a的n次幂的算法

问题

设计一个高效的求a的n次幂的算法

算法

设计思路

经验丰富的话可能一下子就想出了,但是刚开始都是设计出一般的算法,然后再考虑优化的

比如说求a的n次幂,很容易就想到了用for循环,时间复杂度为O(n),

既然要设计一个更高效的方法,O(n)往下就是O(log(n))了,或者常数,常数就是一下子就算出来了,不太可能,所以考虑设计一个时间复杂度为O(log(n))的算法

对于增长到指定数类的题目,当基数呈指数级增长时,时间复杂度为O(log(n)),这里就是要让a的指数从1到n呈指数增长,而不是1,2,3...n这样子

所以考虑让a的指数翻倍增长,即(1,2,4,,8...n),即每次res=res*res (res初始为a) 而不是res=res*a ,这样的话res=2^k, 每次res 翻倍 k 可能会超过 n ,所以需要判断条件

代码

/*
求a的n次幂
时间复杂度为o(n)*/
int pow(int a,int n){
    int res=1;
    for(int i=0;i<n;i++){
        res*=a;
    }
    return res;
} 

/*
求a的n次幂
时间复杂度为o(log(n))*/
int pow2(int a,int n){
    int res=a;
    int ex=1;//res的指数,用于判断res*res后指数是否大于n 
    
    if(n==0){
        return 1;
    } 
    
    //res能翻倍 
    while((ex<<1)<=n){//ex<<1即ex翻倍,效果等价于res*res 
        res=res*res;//
        ex<<=1;
    }
    //res不能翻倍
    //这里递归调用,将a^(n-ex)继续按照翻倍的方式进行增大,再乘以之前得到的res即可得到结果 
    n=n-ex;//n-ex即剩余的*a的次数 
    return res*pow2(a,n);//递归调用,让剩余的*a次数继续从1按照指数的形式增长
} 

相关文章

  • 2.13 实战:快速设计一个高效的求a的n次幂的算法

    Chapter2: 时间复杂度分析、递归、查找与排序 13. 实战:快速设计一个高效的求a的n次幂的算法 问题 设...

  • 分治法的常见问题

    计算x的n次幂 朴素算法:xxx...... 分治算法: n为偶数:x的n/2次幂*x的n/2次幂 n为奇数:x的...

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

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

  • 快速幂

    常规求幂 快速求幂(一般) 快速求幂 (递归) 快速求幂(位运算) 快速求幂(位运算,更简洁)

  • 2018-07-09-快速幂

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

  • 快速幂求a的b次方

    快速幂的目的:快速求幂 ,a的b次方。 平常我们算一个a的b次方的时间为O(b),也就是O(n)的时间复杂度,当然...

  • 判断一个数是否是2的幂次

    题目:判断给定的一个数是否是2的幂次。 这么简单又高效的算法,就要归功于n & (n-1)的妙用了。基本原理: 弄...

  • 求n次方的高效算法

    注:次幂n为整数,底数可以是整数、小数、矩阵等(只要能进行乘法运算的 举个求整数的n次方的例子(Go语言版):

  • 快速幂取模算法

    算法简介 快速幂取模算法是在o( logn )的时间内求得 a ^ b % n的值 先证明结论:a*b % c =...

  • 分治与递归--实数的整数次幂

    给定实数 x 和整数 n, 求 x的n次幂时间复杂度:O(logN)

网友评论

      本文标题:2.13 实战:快速设计一个高效的求a的n次幂的算法

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