2011-03-08 29 views
16

我實現了這個函數power(),它帶有兩個參數ab並計算出b功耗的時間複雜度()

typedef long long int LL; 

LL power(int a,int b) 
{ 
    int i = 1; 
    LL pow = 1; 
    for(; i <= b ; ++i) 
    pow *= a; 
    return pow; 
} 

給定:一個B以long long int範圍下降。
問題:如何減少算法的時間複雜度?

+0

鑑於精度任意程度的複雜性,可以在常量時間內計算指數。 – Crashworks 2011-03-08 10:23:59

+0

@Crashworks只有當指數被一個常量限定時,對吧? – vidstige 2011-03-08 10:27:01

+0

@vidstige是的,我假設base和exponent都存儲在一個有限長度的寄存器中。 – Crashworks 2011-03-08 10:28:52

回答

31

按平方排列的指數。

enter image description here

一種非遞歸實現

LL power(int a, int b) 
{ 
    LL pow = 1; 
    while (b) 
    { 
     if (b & 1) 
     { 
      pow = pow * a; 
      --b; 
     } 
     a = a*a; 
     b = b/2; 
    } 
    return pow; 
} 

該算法需要日誌 b squarings和至多日誌 b乘法。

的運行時間爲O(log B)


4

冪的平方不給在所有情況下乘法的數量降到最低。尋找「附加鏈」,「布勞爾鏈」,「漢森連鎖店」和「Scholz猜想」。

+0

只要它鏈接到閱讀這些特定算法,這個答案就會更加有用。 – Daniel 2015-12-14 17:47:31

4

用正方形乘以指數。這就是說,如果我們需要a^b,我們檢查b是否均勻,如果b是偶數,我們找到(a^2)^(b/2),否則我們找到a*((a^2)^(b/2))。這可能不是最好的算法,但它比線性算法更好。

int Power(int a, int b) 
{ 
    if (b>0) 
    { 
     if (b==0) 
      return 1; 
     if (a==0) 
      return 0; 
     if (b%2==0) { 
      return Power(a*a, b/2); 
     } 
     else if (b%2==1) 
     { 
     return a*Power(a*a,b/2); 
     } 
    } 
    return 0; 
} 
3

下面是遞歸實現的Java代碼 爲2到n的功率與O(log n)的使用Exponentiation by squaring

int ans=1; 
public int myTwoPower(int n){ 
    if(n<=0) 
     return 1; 

    if(n%2 !=0){    
     return myTwoPower(n-1)*2; 
    } 
    else{ 
     ans = myTwoPower(n/2); 
     return ans * ans; 
    } 
} 

enter image description here