es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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).

Tags:  ,

Answer

  1. Avatar for 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.

Comments are closed.