El documento explica los conceptos básicos de análisis de complejidad de algoritmos, incluyendo notación Big O y Θ. Define las funciones de tiempo de ejecución asintótico para diferentes tipos de bucles anidados y explica que la complejidad de un algoritmo depende del caso más común o lento.
2. Repaso de comportamiento asintótico
• El eliminar todas estas constantes
ornamentales hacen más sencillo identificar el
comportamiento asintótico de una función
contadora-de-instrucciones de un programa.
• Cualquier programa que carezca de bucles
tendrá una f(n) = 1, ya que el número de
instrucciones que requiere es simplemente
una constante (a menos que utilice recursión).
3. Repaso de comportamiento asintótico
• Cualquier programa con un único bucle que
vaya desde 1 a n tendrá f(n) = n, ya que
ejecutará un número fijo de instrucciones
antes del bucle, un número fijo de
instrucciones después del bucle y un número
constante de instrucciones dentro del bucle
que corre n veces.
4. Regla General 1
• El análisis de programas sencillos se puede
hacer contando los bucles anidados que
contiene el programa.
– Un sólo bucle sobre n ítems genera f(n)=n.
– Un bucle dentro de otro bucle f( n ) = n2.
– Un bucle dentro de un bucle que está dentro de
otro bucle genera f( n ) = n3.
5. Regla General 2
• Dado un conjunto de bucles que son
secuenciales, el más lento de ellos determina
el comportamiento asintótico del programa.
• Dos bucles anidados, seguidos por un solo
bucle, asintóticamente es lo mismo que los
bucles anidados por sí solos, ya que los bucles
anidados dominan el bucle individual.
6. Notación Theta
• Ahora, enfoquémonos en la sofisticada
notación que los científicos computacionales
utilizan.
• Cuando hayamos encontrado la f asintótica
exacta, diremos que nuestro programa es
Θ(f( n )).
7. Notación Theta
• Por ejemplo, los programas anteriores son
• Θ( 1 ), Θ( n2 ) y Θ( n2 ) respectivamente.
• Θ(n) se pronuncia "theta de n".
• A veces diremos que f(n), la función original
que cuenta las instrucciones que incluyen las
constantes es Θ(algo)
8. Notación Theta
• Por ejemplo, podremos decir que f( n ) = 2n es
una función que es Θ( n ) - nada nuevo en
esto.
• También podremos escribir 2n ∈ Θ( n ), lo cual
se pronuncia " dos n es theta de n”.
9. Notación Theta
• No se confunda con esta notación: Todo lo
que está diciendo es que si hemos contados el
número de instrucciones que un programa
requiere y que si esa cantidad es 2n, entonces
el comportamiento asintótico de nuestro
algoritmo es descrito por n, a lo cual llegamos
al eliminar las constantes.
10. Notación Theta
• Dada esta notación, los siguientes son algunos
enunciados puramente matemáticos.
n6 + 3n ∈ Θ( n6 )
2n + 12 ∈ Θ( 2n )
3n + 2n ∈ Θ( 3n )
nn + n ∈ Θ( nn )
11. Notación Theta
• Llamamos esta función, esto es, lo que
colocamos dentro de Θ (aquí) como
complejidad temporal, o simplemente
complejidad de nuestro algoritmo.
12. Notación Theta
• Entonces, un algoritmo con Θ(n) es de
complejidad n.
• También tenemos nombres especiales para
Θ(1), Θ(n), Θ(n2) y Θ(log(n)) ya que aparecen
bastante seguido.
• Decimos que un algoritmo Θ(1) es un
algoritmo temporalmente-constante, Θ(n) es
linear, θ(n2) es cuadrático y Θ(log(n)) es
logarítmico
13. Notación Big O
• Para evaluar la complejidad de programas
complicados es modificarlos mentalmente
para empeorarlos de manera que sean más
fáciles de analizar y luego encontrar la
complejidad de este nuevo programa que
generamos.
14. Notación Big O
• Si podemos encontrar la complejidad del
programa peor, entonces sabremos que
nuestro programa original es como máximo
así de malo, o mejor que eso.
15. Notación Big O
• De esta forma, si encontramos una buena
complejidad en nuestro programa modificado,
el cual es peor que el original, podremos saber
que nuestro programa original también tendrá
una complejidad bastante buena, tan buena
como la del programa alterado, o incluso
mejor.
16. Notación Big O
• Si esto es así, diremos que el algoritmo original es
O( complejidad peor ).
• Por ejemplo O( n2 ) se pronuncia "O-Grande de n
cuadrado".
• Lo que esto nos dice es que asintóticamente
nuestro programa no es peor que n2.
• Puede que sea mejor que eso, o quizá es igual
que eso.
• Dicho sea de paso, si de hecho nuestro programa
es Θ( n2 ), aún podemos decir que es O( n2 ).
17. Notación Big O
• Para ayudarle a entenderlo, imagine que
alteramos el programa original de un modo
que no cambie tanto, pero que aún así lo hace
algo peor.
• Por ejemplo podemos añadir instrucciones
insignificantes al comienzo del programa.
18. Notación Big O
• Haciendo esto alteraremos la función
contadora-de-instrucciones mediante una
simple constante, la cual se ignora en el
comportamiento asintótico.
• Por esto, un programa que es Θ( n2 ) también
será O( n2 ).
19. Notación Big O
• Pero, a la inversa, un programa que es O( n2 )
podría no ser Θ( n2 ). Por ejemplo, cualquier
programa que es Θ( n ) también es O( n2 )
además de ser O( n ).
20. Notación Big O
• Si nos imaginamos que un programa Θ( n ) es
un bucle sencillo “for” que se repite n veces,
podremos empeorarlo al envolverlo en otro
bucle “for” que también se repita n veces,
generando así un programa con f( n ) = n2.
21. Notación Big O
• Si generalizamos esto, cualquier programa que
sea Θ( a ) es O( b ) cuando b es peor que a.
• Note que nuestra alteración al programa no tiene
porqué darnos un programa que sea equivalente
o comparable a nuestro programa original.
• Solamente tiene realizar más instrucciones que el
original para un n dado, ya que simplemente lo
estaremos usando para contar instrucciones, no
para resolver nuestro problema concreto.
22. Notación Big O
• Por tanto, afirmar que nuestro programa es
O( n2 ) es quedarse a resguardo: Hemos
analizado nuestro algoritmo y hemos
encontrado que nunca es peor que n2.
• Pero podría darse el caso de que de hecho sea
n2.
• Esto nos entrega un buen estimativo de qué
tan rápido corre nuestro programa.
23. Tarea MRR 7
• De los programas de ordenamiento que
hemos visto (inserción y burbuja), modifiquen
su análisis asintótico para que encuentren una
notación Big O adecuada para dichos
algoritmos.
• En tu cuaderno MRR explica cuál es tu
propuesta de modificación de los algoritmos
de ordenamiento para obtener una notación
Big O de los mismo. Justifica tu respuesta.