2011-03-08 15 views
16

Bu işlevi,ve b iki bağımsız değişkeni alan ve b hesaplayan power() bu işlevi uyguladık.Gç zamanının karmaşıklığı()

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; 
} 

Verilen: long long int aralığında bulunan bir b.
Sorun: Algoritmamın zaman karmaşıklığını nasıl azaltabilirim?

+0

kullanarak karmaşıklığı (n log) 'dir, exponentation'ı sabit zamanda hesaplamak mümkün. – Crashworks

+0

@Crashworks yalnızca üs bir sabit ile sınırlanmışsa, doğru mu? – vidstige

+0

@vidstige Evet, baz ve üslerin sonlu uzunlukta bir kayıtta saklandığını farz ediyorum. – Crashworks

cevap

31

Squaring tarafından Exponentiation.

enter image description here

olmayan yinelemeli uygulama

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; 
} 

Bu algoritma günlüğünü b Squarings ve en log b çarpmalar gerektirir.

çalışma süresi O


4

üs alma lib GMP bakın. "Ek zincirleri", "Brauer zincirleri", "Hansen zincirleri" ve "Scholz varsayımı" nı arayın.

+0

Bu cevap, o belirli algoritmaların okunmasıyla ilgili bağlantılara sahip olsaydı çok daha kullanışlı olurdu. – Daniel

4

Üslemeyi kareler ile kullanın. Yani bir^b'ye ihtiyacımız varsa, b'nin bile olduğunu kontrol ederiz, eğer b bile, (a^2)^(b/2)'u buluruz, a*((a^2)^(b/2))'u buluruz. Bu en iyi algoritma olmayabilir, ancak doğrusal algoritmadan daha iyidir.

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

İşte O ile üssü n 2 için Java kodu yinelenen uygulama hassas bir keyfi derecesi göz önüne alındığında 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

İlgili konular