Es muy simple. Solo observa lo que haces aquí.
Vamos a revertir el ciclo a
for (int j = n; j> = 1; j / = 2) {// algún trabajo constante}
La serie es así: n, n / 2, n / 4, n / 8,. . . . 1
- Lingüística computacional: ¿Cuál es la mejor manera de encontrar coincidencias aproximadas de cadenas (duplicados difusos) entre un conjunto de N cadenas?
- ¿Cuáles son algunos proyectos geniales de verano de informática personal en IoT y / o algoritmos?
- ¿Cómo calculamos la complejidad espacio-temporal de un algoritmo?
- ¿Cuál es el problema conmigo si puedo decir cómo funciona el algoritmo pero no puedo escribir el programa para el mismo? ¿Cómo puedo deshacerme de él? ¿Por favor ayuda?
- Cómo entender la precisión Top-N en el aprendizaje automático de una manera simple
¿Puedes encontrar algo en esa serie? Es una progresión geométrica (progresión geométrica – Wikipedia).
es decir. n / (2 ^ 0), n / (2 ^ 1),. . . . 1
Prueba:
El último término es 1, que significa n / (2 ^ k) = 1, es decir. (2 ^ k) = (n), donde k es un número entero no negativo.
Tomando log2 en ambos lados,
k = log2 (n).
lo que implica que el tiempo de ejecución = O (log2 (n))
También estás haciendo un trabajo constante cada vez, es decir. a ++ es O (1).
que da el tiempo de ejecución general como O (log2 (n)).
Teorema maestro:
También puedes usar Master Theorem para probar.
Primero escribimos la función recursiva.
T (n) = T (n / 2) + O (1).
Forma general: T (n) = aT (n / b) + O (n ^ d).
Aquí a = 1, b = 2, d = 0
Tenemos el caso de a = b ^ d
entonces T (n) = (n ^ d) log n
=> T (n) = log n
Feliz codificación !!