快速冪

概率

顧名思義,快速冪就是快速算底數的 n 次冪。其時間複雜度爲 O(log₂N),與樸素的 O(N) 相比效率有了極大的提高。

原理

使用求 a 的 b 次方來解釋。把 b 轉換成二進制數,該二進制數第 i 位的權爲 2^{i-1}。例如:a^{11}=a^{2^{0}+2^{1}+2^{3}},11 的二進制爲 1011,即 11=1*2^{3}+0*2^{2}+1*2^{1}+1*2^{0},因此,可以將 a^{11} 轉化爲算 a^{2^{0}+2^{1}+2^{3}}。這樣原來計算 a^{11} 需要計算 11 次,通過快速冪只需要計算 3 次。從而降低了算法的複雜度。

算法思路

使用位運算。

1)當 b 是奇數時,那麼有 a^{b}=a*a^{b-1}

2)當 b 是偶數時,那麼有 a^{b}=a^{\frac{b}{2}}*a^{\frac{b}{2}}

代碼實現

最樸素的求冪方法

使用簡單的累乘,代碼如下,暫時不考慮數據越界問題。

int Pow(int a, int b){
    int ans = 1;
    for (int i = 0; i<b; i++){
        ans *= a;
    }

    return ans;
}

可以看出,該算法的時間複雜度爲 O(n)。

遞歸版快速冪

int Pow(int a, int b) {
    if (0==b) {
        return 1;
    }
    if (b&1) {
        //b爲奇數
        return a*Pow(a, b-1);
    } else {
        //b爲偶數
        int t = Pow(a, b/2);
        return t*t;
    }
}

可以看出,該算法的時間複雜度爲 O(logb),也就是 O(logn)。

迭代版快速冪

int Pow(int a, int b) {
    int result=1;
    int base=a;

    while (b) {
        if (b&1) {
            result *= base;
        }
        base *= base;
        b >>= 1;
    }

    return result;
}

可以看出,該算法的時間複雜度爲 O(logb),也就是 O(logn)。

base *= base解析

因爲 base * base == base^{2},下一步再乘,就是 base^{2}*base^{2}==base^{4},然後再乘 base^{4}*base^{4}==base^{8},由此可以推導出 base\rightarrow base^{2}\rightarrow base^{4}\rightarrow base^{8}......。可以發現指數正是 2^{i}

再看上面解析的例子 a^{11}=a^{2^{0}+2^{1}+2^{3}},這三項就可以完美解決了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章