Comprensión del ejemplo 16 de la impresión de las potencias de 2 desde la notación Big O – Descifrando la entrevista de programación.
¿Habría omitido el autor el cálculo de las llamadas de E/S?
La siguiente función imprime las potencias de 2 desde 1 hasta n (inclusive). Por ejemplo, si n es 4, imprimiría 1, 2 y 4. ¿Cuál es su tiempo de ejecución?
int powersOf2(int n) {
if (n < 1) {
return 0;
} else if (n == 1) {
System.out.println(1);
return 1;
} else {
int prev = powersOf2(n / 2);
int curr =prev * 2;
System.out.println(curr);
return curr;
}
}
El tiempo de ejecución es O(log n)
Según el ejemplo 12 (permutaciones de cadena), la longitud del argumento de la llamada System.out.println()
tiene sentido:
Ejecutar la línea 7 toma tiempo O(n) ya que cada carácter debe imprimirse.
Desde la perspectiva de E/S, necesitamos imprimir las potencias de 2 desde 0 hasta K, donde K es [log(N)], la cantidad de caracteres a imprimir para 2X es [1 + X/log(10)]
, por lo que la cantidad total de caracteres a imprimir es [K + 1 + K*(K+1)/2log(10)]
y el tiempo de ejecución es O(log2N) pero no O(log N)
PD.
El ejemplo 15 – imprimiendo números de Fibonacci memorizados parece tener la misma limitación:
void allFib(int n) {
int[] memo = new int[n + 1];
for (int i = 0; i < n; i++) {
System.out.println(i + ": " + fib(i, memo));
}
}
int fib(int n, int[] memo) {
if (n <= 0) return 0;
else if (n == 1) return 1;
else if (memo[n] > 0) return memo[n];
memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
return memo[n];
}
Estamos haciendo una cantidad constante de trabajo N veces, por lo que esto es tiempo O(n).
La cantidad de caracteres a imprimir para la secuencia de los primeros N números de Fibonacci ~ N2, por lo que el tiempo de ejecución debería ser O(N2).
davy.ai
El autor puede haber omitido calcular las llamadas de E/S en ambas funciones proporcionadas, “powersOf2” y “allFib”. Mientras que las complejidades de tiempo de ejecución se analizan correctamente como O(log n) y O(n), respectivamente, es posible que no representen con precisión el tiempo de ejecución real debido a las llamadas de E/S.
En el caso de “powersOf2”, se imprimen un total de “[K + 1 + K * (K + 1) / 2 log (10)]” caracteres, donde K es [log(N)]. Por lo tanto, el tiempo de ejecución real se puede aproximar como O(log^2(N)) en lugar de O(log n).
De manera similar, en el caso de “allFib”, la cantidad de caracteres que se deben imprimir para la secuencia de los primeros N números de Fibonacci es ~ N^2. Por lo tanto, el tiempo de ejecución real de la función se puede aproximar como O(N^2), en lugar de O(n).
Por lo tanto, es importante considerar el impacto de las llamadas de E/S al analizar la complejidad de tiempo de ejecución de las funciones.