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.
El hermano Juan pensó para sí qué tipo de pregunta se hizo, ¿pasó por el proceso?
El entrevistador frunció el ceño:
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 m
del bucle normal n
y la complejidad del tiempo es O(n)
.
Supongamos m为3
que n为9
la fórmula es: 3 x 3 x 3 x 3 x 3 x 3 x 3 x 3 x 3
=19683
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.m²
n/2
结果值*m
Si es así 奇数n
, la complejidad del tiempo es O(n/2-1)
y el número par n
esO(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 m
valor 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/2
queda así. El algoritmo logarítmico es muy eficiente.
Pero en este caso, si hay un número impar, n/2
el proceso de cuadrado se perderá una vez, por lo que si n
es 奇数
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:
Al final r x base = 19683
, es equivalente al resto de la figura anterior 单个m值
que debe elevarse al cuadrado con el valor resultante.
La complejidad temporal de este método es O(logn)
y la complejidad temporal relativa es menor.