Notación Big O para la recursividad fib

¿Cuál es el tiempo de ejecución de Big-O de la siguiente función? Explique.

static int fib(int n){
  if (n <= 2)
     return 1;
  else 
     return fib(n-1) + fib(n-2)
   }

Además, ¿cómo reescribiría la función fib(int n) con un tiempo de ejecución Big-O más rápido iterativamente? sería esta la mejor manera con O(n):

 public static int fibonacci (int n){
 int previous = -1;
 int result = 1;
 for (int i = 0; i <= n; ++i)
 {
 int sum = result + previous;
 previous = result;
 result = sum;
 }
 return result;
}
}

preguntado el 28 de julio de 12 a las 03:07

Resolver para T(n) en T(n) = c + T(n-1) + T(n-2). -

T(n)= T(n-1) + T(n-2) + O(1) T(n)= O(2^n-1) + O(2^n-2) + O(1) = O(2^n) es lo que tengo. Solo revisándome dos veces -

Solo trato de obtener una comprensión completa del uso de Big O y la recursividad. -

Big O y la recursividad no son específicos del idioma, por lo que esta no es realmente una pregunta de Java. -

Esto es un poco tarde ya que alguien ya dio la respuesta y fue aceptada, pero generalmente es malo simplemente plantear el problema y pedir una respuesta. Sería mejor si plantea el problema y luego nos dice qué solución tiene hasta ahora y exactamente de qué no está seguro. (Creo que el segundo fragmento de código podría ser su trabajo, por lo que mi comentario está dirigido principalmente a la primera parte de su pregunta) -

1 Respuestas

Pruebas

Modelas la función de tiempo para calcular Fib(n) como suma de tiempo para calcular Fib(n-1) más el tiempo para calcular Fib(n-2) más el tiempo para sumarlos juntos (O(1)).

T(n<=1) = O(1)

T(n) = T(n-1) + T(n-2) + O(1)

Resuelve esta relación de recurrencia (usando funciones generadoras, por ejemplo) y terminarás con la respuesta.

Alternativamente, puede dibujar el árbol de recursividad, que tendrá profundidad n e intuitivamente descubrir que esta función es asintóticamente O(2n). Luego puede probar su conjetura por inducción.

Base: n = 1 es obvio

Asumir T(n-1) = O(2n-1), por lo tanto

T(n) = T(n-1) + T(n-2) + O(1) que es igual a

T(n) = O(2n-1) + O(2n-2) + O(1) = O(2n)

versión iterativa

Tenga en cuenta que incluso esta implementación solo es adecuada para valores pequeños de n, ya que la función de Fibonacci crece exponencialmente y los enteros de Java con signo de 32 bits solo pueden contener los primeros 46 números de Fibonacci

int prev1=0, prev2=1;
for(int i=0; i<n; i++) {
  int savePrev1 = prev1;
  prev1 = prev2;
  prev2 = savePrev1 + prev2;
}
return prev1;

Respondido 28 Jul 12, 04:07

exactamente lo que tenía. increíble. gracias por la ayuda. solo quería verificar dos veces. - Jorge Denver

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.