Encuentre m elevado a la enésima potencia (optimice la complejidad del tiempo)

tema

El hermano Juan fue hoy a una fábrica internacional para una entrevista e hizo la primera pregunta justo después de sentarse y saludar al entrevistador.

inserte la descripción de la imagen aquí
El hermano Juan pensó para sí qué tipo de pregunta se hizo, ¿pasó por el proceso?

El entrevistador frunció el ceño:

inserte la descripción de la imagen aquí
Según el entrevistador, no quedó muy satisfecho con la solución de Juan 时间复杂度, y Juan pensó durante 15 minutos pero no pudo entenderlo;

卷哥:卒

respuesta

Se encuentra la potencia mdel bucle normal ny la complejidad del tiempo es O(n).

Supongamos m为3que n为9la fórmula es: 3 x 3 x 3 x 3 x 3 x 3 x 3 x 3 x 3=19683

inserte la descripción de la imagen aquí

Extraiga contenido duplicado como( 3 * 3 ) valor base, luego el número cuadrado es Necesita juzgar si n es un número par o impar, y el número impar es el resultado final.n/2结果值*m

inserte la descripción de la imagen aquí

Si es así 奇数n, la complejidad del tiempo es O(n/2-1)y el número par nesO(n/2)

El código se muestra a continuación:

    public int process(int m,int n){
    
    
        int index = n/2,rm = m*m,result = rm;
        for (int i = 0; i < index-1; i++) {
    
    
            result *= rm;
        }
        if (n % 2 != 0){
    
    
            result *= m;
        }
        return result;
    }

¿Existe algún algoritmo con menor complejidad temporal?

Lo anterior es fijo 两个值缩减, y la eficiencia es fija, que es O (n/2), analicémoslo nuevamente: el mvalor del cuadrado es fijo, entonces no podemos fijar los dos valores para reducir, de todos modos, el valor es fijo y después de cada cuadrado n/2queda así. El algoritmo logarítmico es muy eficiente.

Pero en este caso, si hay un número impar, n/2el proceso de cuadrado se perderá una vez, por lo que si nes 奇数el valor actual, es necesario hacerlo * m原始值una vez.

El código se muestra a continuación:

    public int process(int m,int n){
    
    
        int r=1,base=m;
        while(n!=0){
    
    
            if(n%2 != 0)
                r*=base;
            base*=base;
            n/=2;
        }
        return r;
    }

Gráfico de pasos:

inserte la descripción de la imagen aquí

Al final r x base = 19683, es equivalente al resto de la figura anterior 单个m值que debe elevarse al cuadrado con el valor resultante.

inserte la descripción de la imagen aquí

La complejidad temporal de este método es O(logn)y la complejidad temporal relativa es menor.

Supongo que te gusta

Origin blog.csdn.net/AnNanDu/article/details/126751056
Recomendado
Clasificación