14. Loop Invariante para Insertion-sort En el principio de cada iteracion del loop for el sub-arreglo A[1,..,i-1] consiste de los elementos original/ in A[1,..,i-1] pero en orden.
15. Antes de empezar el loop i=2, el sub-arreglo A[1,..,i-1] consiste unica/ del A[1], el cual es de hecho el elemento original A[1]. Este sub-arreglo es ordenado (trivial/, por supuesto). INICIALIZACION
16. x 1 x 2 x 3 ... i j ... x n Antes de empezar la iteracion i=2 max{x 1 , x 2 } i j ... x n min{x 1 , x 2 } MANTENIMIENTO Antes de empezar la iteracion i=3
17. i j ... x n x i 1 max{x 1 , x 2 } i j ... x n min{x 1 , x 2 } x 3 x i 2 x i 3 {x i 1 ,x i 2 ,x i 3 }= {x 1 ,x 2 ,x 3 } x i 1 < x i 2 < x i 3 Antes de empezar la iteracion i=3 Antes de empezal la iteracion i=4
18. i j i j {x i 1 ,x i 2 ,...,x i k }= {x 1 ,x 2 ,...,x 3 } x i 1 < x i 2 <...< x i 3 Antes de empezar la iteracion i=k Antes de empezar la iteracion i=k+1 ... x n x i 1 x i 2 x i 3 ... x i k-1 x k ... x n x i 1 x i 2 x i 3 ... x i k-1 x i k
19. En la terminacion i=n+1 el sub-arreglo A[1,..,i-1] consiste de los elementos en el arreglo original A[1,..,n] pero de manaera ordenada. Por esto el algoritmo es correcto. TERMINACION
20.
21.
22.
23. Tiempo de Ejecucion: Sobre una entrada particular es el numero de operaciones primitivas (pasos) ejecutados . • Queremos definir los pasos independientes de la maquina . • Suponga que c/linea de pseudocodigo requiere una cantidad constante de tiempo. • Una linea puede tomar una cantidad diferente de tiempo que otra, pero cada ejecucion de la linea i toma la misma cantidad de tiempo ci . • Esto es asumiendo que la linea consiste unica/ de operaciones primitivas • Si la linea es una llamada a subrutina, entonces la llamada actual toma un tiempo constante, pero la ejecucion de la subrutina siendo llamada podria no. • Si la linea especifica operaciones diferentes a las primitivas entonces podria tomar mas que un tiempo constante. Ej: “ordene los puntos por coordenadas x.”
24.
25.
26. El tiempo de ejecucion del algoritmo es la suma de los tiempos de ejecucion para c/sentencia ejecutada.Para computar T(n), el tiempo de ejecucion del algoritmo, nosotros sumamos los productos de COSTO y VECES obteniendo: El tiempo de ejecucion depende de los valores de t j . Estos varian de acuerdo con la entrada.
27. Complejidad de tiempo en el mejor caso t b (n) En este caso t i = 1 entonces t b (n) = c 1 n + (c 2 +c 4 +c 8 ) n-1 + c 5 i=2,..,n 1 + (c 6 +c 7 ) i=2,..,n 0 = (c 1 +c 2 +c 4 +c 8 +c 5 ) n - (c 2 +c 4 +c 8 +c 5 ) = an+b = (n). Puede expresar T (n) como an + b para constantes a y b (que dependen del costo de la sentencia ci )⇒ T (n) es una funcion lineal de n . Complejidad de tiempo en el peor caso t w (n) En este caso t i = i entonces t w (n) = c 1 n + (c 2 +c 4 +c 8 ) n-1 + c 5 i=2,..,n i + (c 6 +c 7 ) i=2,..,n (i-1) = an 2 +bn+c = ( n 2 ).
28.
29.
30.
31.
32. Porque hay que buscar la eficiencia Tendra sentido invertir tiempo intentando diseñar algoritmos mas eficientes sabiendo que las computadoras se vuelven mas y mas rápidas? Supongamos que que para resolver un problema disponemos de de un algoritmo exponencial y de una computadora que puede ejecutar este algoritmo para casos de tamaño n en 10 -4 x 2 n segundos. Es decir el programa resuelve un ejemplar de tamaño 10 en aprox. un décimo de seg., uno de tamaño 20 en aprox. Dos minutos y para resolver un ejemplar de tamaño 30 no bastará todo un dia de tiempo de cálculo. Suponiendo que fuera posible hacer funcionar un año seguido la máquina se podría llegar a resolver un ejemplar de tamaño 38. Supongamos que podemos comprar una computadora 100 veces mas rápida que la anterior. Ahora con el mismo algoritmo podemos resolver un ejemplar de tamaño n en _________seg. No mucho, pero cuando determine que la nueva maquina en un año no podrá resolver nisiquiera un ejemplar de tamaño 45. En genral si antes se podía resolver un ejemplar de tamaño n en un tiempo determinado, la nueva máquina resolverá ejemplares de tamaño como máximo ___________ en el mismo tiempo.