Big O: anidado para bucle con dependencia


9

Me dieron una tarea con Big O. Estoy atrapado con bucles anidados que dependen del bucle anterior. Aquí hay una versión modificada de mi pregunta de tarea, ya que realmente quiero entenderla:

sum = 0;
for (i = 0; i < n; i++ 
    for (j = 0; j < i; j++) 
        sum++;

La parte que me está sacudiendo es la j < iparte. Parece que se ejecutaría casi como un factorial, pero con suma. Cualquier pista sería muy apreciada.


Buena explicación aquí
saadtaame

Respuestas:


10

Permítanme aclarar algunas cosas, están interesados ​​en la notación big-O, esto significa límite superior . En otras palabras, está bien contar más pasos de los que realmente hace. En particular, puede modificar el algoritmo para

 ...
    for (j = 0; j < n; j++) 
 ...

Entonces tienes dos bucles anidados, cada bucle se ejecuta veces, lo que te da un límite superior deO ( n 2 )nO(n2)

Por supuesto, le gustaría tener una buena estimación para el límite superior. Entonces, para completar, queremos determinar un límite inferior. Esto significa que está bien contar menos pasos. Entonces considera la modificación

for (i = n/2; i < n; i++)
    for (j = 0; j < n/2; j++) 
        sum++;

Aquí, realizamos solo algunas de las iteraciones de bucle. Nuevamente tenemos dos bucles anidados, pero esta vez tenemos iteraciones por bucle, lo que muestra que tenemos al menos adiciones. En este caso, denotamos este límite inferior asintótico por . Como el límite inferior y el superior coinciden, incluso podemos decir que es un límite asintótico estrecho, y escribimos .n 2 / 4 Ω ( n 2 ) n 2 Θ ( n 2 )n/2n2/4Ω(n2)n2Θ(n2)

Si quieres saber más, lee aquí .


6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

Vamos a rastrear esto:

  • Cuando i = 0, el bucle interno no se ejecutará en absoluto ( 0<0 == false).
  • Cuando i = 1, el bucle interno se ejecutará una vez (para j == 0).
  • Cuando i = 2, el bucle interno se ejecutará dos veces. (para j == 0 y j == 1).

Este algoritmo incrementará así sumel siguiente número de veces:

x=1nx1=0+1+2+3+4...+n1=n(n1)2

Podemos ver por inspección que la suma es un "número triangular". Distribuyendo en el resto del numerador, llegamos a , cuyo término de crecimiento más rápido es por lo tanto, la complejidad de Bachman-Landau Big-Theta es .n 2 - nn n2θ(n2)O(n2)andΩ(n2)n2n2n2θ(n2)O(n2) and Ω(n2)


3

veamos si puedo explicar esto ...

Entonces, si el bucle interno era j

Ahora, para la primera iteración, haces n- (n-1) veces a través del bucle interno. en la segunda vez que haces n- (n-2) veces a través del bucle interno. En la enésima vez que haces n- (nn) veces, que es n veces.

si promedia el número de veces que pasa por el ciclo interno, n / 2 veces.

Entonces podría decir que esto es O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)

¿Tiene sentido?


Es un poco raro, ¡pero creo que lo entiendo! ¡Gracias! Puede tomar un poco de tiempo hundirse en jaja

Entonces, si esa j < iparte fuera realmente j < i^2, ¿la O resultante para esa parte sería n ^ 2/2?

En primer lugar, tenga en cuenta que O (n ^ 2/2) = O (n ^ 2). Ahora, si lo cambia a j <i ^ 2, entonces está haciendo (n- (n-1)) ^ 2 en la primera iteración y n ^ 2 en la última iteración. No recuerdo cuál sería la notación big-O para el bucle interno. O (n ^ 2) es un límite superior suelto. Entonces, un límite superior suelto para todo sería O (n ^ 3), pero ese bucle interno es menor que O (n ^ 2). ¿Tiene sentido?
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.