2011-03-08 17 views
16

Implementé esta función power() que toma dos argumentos a y b y calcula un b.Complejidad del tiempo de la potencia()

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

Dado: un b cae en el rango de long long int.
Problema: ¿Cómo puedo reducir la complejidad del tiempo de mi algoritmo?

+0

Dado un grado arbitrario de precisión, es posible calcular la exponenciación en tiempo constante. – Crashworks

+0

@Crashworks solo si el exponente está delimitado por una constante, ¿no? – vidstige

+0

@vidstige Sí, supongo que tanto la base como el exponente se almacenan en un registro de longitud limitada. – Crashworks

Respuesta

31

Exponencialización por cuadratura.

enter image description here

una implementación no recursiva

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

Este algoritmo requiere registro b squarings y como máximo registro b multiplicaciones.

El tiempo de ejecución es O (log b)


4

exponenciación binaria no da el mínimo número de multiplicaciones en todos los casos. Busque "cadenas de adición", "cadenas de Brauer", "cadenas de Hansen" y "conjetura de Scholz".

+0

Esta respuesta hubiera sido mucho más útil si tuviera enlaces a la lectura de esos algoritmos en particular. – Daniel

4

Utilice la exponenciación por cuadrados. Es decir, si necesitamos a^b, comprobamos si b es par, si b es par, encontramos (a^2)^(b/2), de lo contrario, encontramos a*((a^2)^(b/2)). Puede que este no sea el mejor algoritmo, pero es mejor que el algoritmo lineal.

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

Aquí está la implementación recursiva del código Java de 2 a la potencia de n con O (log n) la complejidad utilizando 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

Cuestiones relacionadas