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 < i
parte. Parece que se ejecutaría casi como un factorial, pero con suma. Cualquier pista sería muy apreciada.
Respuestas:
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
Entonces tienes dos bucles anidados, cada bucle se ejecuta veces, lo que te da un límite superior deO ( n 2 )norte O(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
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/2 n2/4 Ω(n2) n2 Θ(n2)
Si quieres saber más, lee aquí .
fuente
Vamos a rastrear esto:
0<0 == false
).Este algoritmo incrementará así
sum
el siguiente número de veces: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)n2−n2 n2 θ(n2)≡O(n2) and Ω(n2)
fuente
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?
fuente
j < i
parte fuera realmentej < i^2
, ¿la O resultante para esa parte sería n ^ 2/2?