2011-05-23 18 views
5

Esta pregunta se hace para fines de revisión de un pasado hoja de examen Yo sólo quiero saber si estoy en el camino correctoComplejidad de tiempo

1. int i=1; 
2. while (i <= n) { 
3. for (int j=1; j<10; j++) 
4.  sum++; 
5. i++; 
6. } 
7. for(int j = 1; j <= n; j++) 
8. for(int k = 1; k <= n; k=k*2) 
9.  sum++; 

1.) ¿Cuántas veces se ejecuta comunicado 4?
A. O (n)
B. O (n^2)
C. O (log n)
D. O (n log n)
E. ninguno de los anteriormente

Aquí eligió A

2.) ¿Cuántas veces se ejecuta la instrucción 9?
A. O (n)
B. O (n^2)
C. O (log n)
D. O (n log n)
E. Ninguno de los anteriores

Debido línea 8 (k = k * 2) Elegí C

3.) ¿Cuál es el tiempo de ejecución de todo el fragmento de código?
A. O (n)
B. O (n^2)
C. O (log n)
D. O (n log n)

Desde O (n) + O (log n) = O (n) así que elegí A

+0

@Neil: ¿Por qué crees que es así? (Presumiblemente esto no es la totalidad del documento de examen, por supuesto.) – ShreevatsaR

+2

@ShreevatsaR: probablemente porque big-O no es ni una cantidad ("¿cuántas veces es ...?") Ni una duración ("¿cuál es el tiempo de ejecución? de ...? "). Mucho mejor sería la más precisa "¿cuál es la complejidad del tiempo de ...?". – paxdiablo

+3

@paxdiablo: Es perfectamente exacto decir "el número de veces que se ejecuta la declaración 4 es O (n)". Es decir, la cantidad/función 10n es O (n). (Una cuestión completamente diferente es que tal vez el periódico debería haber pedido Theta o haber pedido la O (.) Más pequeña, pero eso es perdonable según el nivel del curso). – ShreevatsaR

Respuesta

13

Su respuesta 1 es correcta, está dentro de un bucle controlado solo por n.

La respuesta 2 es incorrecta. Es sería ser O(log n) si la línea 7 no existía pero, como la línea 7 está forzando a las líneas 8 y 9 a ejecutarse varias veces dependiendo de n, la respuesta es O(n log n).

La respuesta 3 es la correcta razonamiento pero adolece del hecho de que la respuesta 2 era incorrecta. O(n) + O(n log n) se simplifica hasta O(n log n).

Entonces las respuestas son A, D y D.

+0

@Annita: Si esta respuesta te ayudó, puedes "aceptarla" haciendo clic en la marca de verificación que se encuentra al lado. – ShreevatsaR

+0

Los comentarios debajo de la línea son incorrectos. Big-O no dice nada sobre el tiempo; especifica la complejidad asintótica, generalmente en términos de alguna operación específica. En ese sentido, está más cerca de "cuántas veces se ejecuta una porción de código" que de cualquier cosa que implique tiempo de ejecución (que también depende de cosas como la localidad --- big-O siempre asume que cualquier operación de entrega es a tiempo constante, donde como el acceso a memoria varía enormemente dependiendo de la caché). –

+1

@James, el paréntesis "para la complejidad del tiempo" deja en claro que estamos hablando de tiempo aquí. – paxdiablo

2

No sé cómo formularon las preguntas, pero si la redacción es como usted dice, su examinador no conocía la definición correcta de O grande (al menos cuando espera las respuestas "correctas") - como "Funciones de Big O" incluir más pequeño ". Entonces, algo que se ejecuta como una función de n en f (n) = 10 n que es lineal también está en O (n), O (n^2), O (n log n). Si uno se pregunta por el "más pequeño" posible, sus respuestas serían

  1. Declaración 4 se ejecuta 10 n veces, los tiempos de modo que A
  2. Declaración 9 se ejecuta n * log n, por lo que D
  3. Aquí se ejecuta la suma de ambos, n + n * log n por lo que (aquí perdió un * n), entonces D sería el derecho.

Así que si múltiples respuestas eran posibles y que sólo se ha solicitado a la cantidad que se ejecuta, las respuestas correctas serían

  1. A, B, D
  2. B, D
  3. B , D
+0

La respuesta * n * log * n * en la pregunta 2 es D, no C. –

+0

Sí, ya lo arregló, leyó mal la letra en las preguntas. – flolo

+0

Todos y cada uno de los tutores y examinadores que he conocido siempre implícitamente querían decir * más pequeño correcto * big-O cuando hablaban/preguntaban sobre big-O de algo a menos que necesitaran usar la propiedad que si la función es O (algo) de lo que es O (algo más grande). –

1

Ans 1: A ie. O (n) ya que la instrucción 4 se ejecutaría 10 * n veces.

Ans 2: D ie. O (nlog (n)) ya que la instrucción 9 se ejecutará n * log (n) veces.

Resp 3: D como la complejidad general [O (n) + O (nlog (n))] sería n * log (n).

Cuestiones relacionadas