快速幂的入门学习

前言

顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
上述是百度百科的解释,快速幂就是在logn的复杂度情况下计算底数n次幂的一种算法。快速幂的板子很短,也很容易记住,在此分享自己对于快速幂的一种理解。

朴素的O(n)算法

代码:

int pow(int A,int n){
    int rst = 1;
    for (int i = 1; i <= n; i++) {
        rst *= A;
    }
    return rst;
}

相信初学者都是如此求幂的,其复杂度O(n),对于数据量大时便不再适用。

二分思想O(log2n)的快速幂算法

我们学习复杂度时,看到logn级别的复杂度,第一时间想到的便是二分思想,快速幂也是一种二分思想减小复杂度的算法。

代码 :

int qPow(int A,int n){
    if (n == 0) {
        return 1;
    }
    int rst = 1;
    while (n) {
        if (n&1) {
            rst *= A;
        }
        A *= A;
        n>>=1;
    }
    return rst;
}

举例说明,对于ans = 3^15 , 其中15 = (1111)2 = 2 ^ 0 + 2 ^ 1+2 ^ 2+2 ^ 3.那么ans 可以转化为算 3 ^ (2 ^ 0) +… +3 ^ (2 ^ 3),这样只需计算这四个式子便可以得出结果,计算过程是 底数3经过一次运算后变为 3 * 3 = 9,再一次运算之后成为 9 * 9 = 81,如此只需要计算4次即可,因为每次循环得到的结果便是 3 ^ (2 ^ 0) ,3 ^ (2 ^ 1) 。通过底数的迭代,运算的次数n = 15,变为 log2n级别的。

可以通过代码看中间结果 :
在这里插入图片描述
在图片中可以看出,A的结果每次运算都会是 3^(2 ^ k),这样便会简化算法。

矩阵快速幂等之后再补吧,没办法,菜鸡一个。

猜你喜欢

转载自blog.csdn.net/qq_39763472/article/details/82778727
今日推荐