快速冪

快速冪的目的:

做到快速求冪。假設我們要求a^b,按照樸素算法就是把a連乘b次,這樣一來時間複雜度是O(b)也即是O(n)級別。如果n非常大時,就會超時。而快速冪的時間複雜度爲O(logn)。


快速冪的原理:

假設我們要求a^b,其實b是可以拆成二進制的,該二進制數第i位的權爲2^(i-1),例如當b==11時,

11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1, 11的二進制是1011,因此a¹¹可以轉化爲算 a^(2^0)*a^(2^1)*a^(2^3),從而可以將原來計算11次轉爲現在算三次。


由於是二進制,很自然地想到用位運算這個強大的工具: &  和 >>  。
 
&運算通常用於二進制取位操作,例如一個數 & 1 的結果就是取二進制的最末位。同時還可以判斷奇偶,x&1==0爲偶,x&1==1爲奇。>>運算則是去掉二進制最後一位。


實現代碼:

int poww(int a,int b){
    int ans=1,base=a;
    while(b!=0){
        if(b&1!=0)
          ans*=base;
        base*=base;
        b>>=1;
  }
    return ans;
}

以b=11爲例,b=1011,二進制從右向左算,但乘出來的順序是 a^(2^0)*a^(2^1)*a^(2^3),是從左向右的。
我們不斷的讓base*=base目的即是累乘,以便隨時對ans做出貢獻。
base*base==base^2,下一步再乘,就是base^2*base^2==base^4,然後同理  base^4*base4=base^8,指數正是 2^i 。



發佈了36 篇原創文章 · 獲贊 1 · 訪問量 9537
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章