Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Analisis Clase2

1,188 views

Published on

Aqui se hara una presentacion del concepto de complejidad

Published in: Education, Technology
  • Login to see the comments

  • Be the first to like this

Analisis Clase2

  1. 1. Universidad de Caldas Facultad de Ingenieria A A nalisis de lgoritmos
  2. 2. INPUT: Una secuencia de numeros <a 1 ,a 2 ,a 3 ,...,a n > <ul><ul><li>PARADIGMA INCREMENTAL </li></ul></ul><ul><li>Solve for 1 </li></ul><ul><li>Solve for 2: usando la solucion para 1 </li></ul><ul><li>Solve for the next: usando la solucion previa </li></ul><ul><li>Solve for n: usando la solucion para n-1 </li></ul>Ordenamiento x Insercion
  3. 3. Ordenamiento x Insercion 9 7 6 15 16 5 10 11 9 7 6 15 16 5 10 11 9 7 6 15 16 5 10 11 7 9 6 15 16 5 10 11 7 9 6 15 16 5 10 11 7 9 6 15 16 5 10 11 6 7 9 15 16 5 10 11 6 7 9 15 16 5 10 11 6 7 9 15 16 5 10 11 6 7 9 15 16 5 10 11 6 7 9 15 16 5 10 11 5 6 7 9 15 16 10 11 5 6 7 9 15 16 10 11 5 6 7 9 15 16 10 11 5 6 7 9 10 15 16 11 5 6 7 9 10 15 16 11 5 6 7 9 10 15 16 11 5 6 7 9 10 11 15 16 5 6 7 9 10 11 15 16
  4. 4. <ul><li>procedimiento insercion ( A [1..n] ) </li></ul><ul><li>for i  2 to n do </li></ul><ul><li>x  A[i] </li></ul><ul><li>j  i-1 </li></ul><ul><ul><li>while x<A[j] and j>0 do </li></ul></ul><ul><ul><li> A[j+1]  A[j] </li></ul></ul><ul><ul><li> j  j-1 </li></ul></ul><ul><li>end-while </li></ul><ul><ul><li>A[j+1]  x </li></ul></ul><ul><ul><li>end-for </li></ul></ul><ul><li>end </li></ul>
  5. 5. 4 3 5 2 i j i=2 1 3 x A i 3 5 2 i j 1 3 i 4 j = i-1 = 1 j = j-1 = 0 Exit while because j<0
  6. 6. 3 5 2 j i=3 1 5 x A i 4 Exit while because x >A[i] j = i-1 = 2
  7. 7. 3 2 5 4 j i=4 1 2 i 3 5 j 1 2 i 4 j = i-1 = 3 j = j-1 = 2 5
  8. 8. 3 4 4 j 1 2 i 3 j 1 2 i 4 j = j-1 =1 j = j-1 = 0 5 5 2
  9. 9. 2 1 4 3 j i=5 5 1 i 2 4 j 1 i 3 j = i-1 = 4 j = j-1 =3 5 5
  10. 10. 3 4 4 j 1 2 i 3 j 1 2 i 4 j = j-1 =1 j = j-1 = 0 5 5 2
  11. 11. 2 4 j 1 i 3 j = j-1 =2 4 5 2 3 j 1 i 3 j = j-1 =2 4 5 1 3 1 2 4 5
  12. 12. Correctitud <ul><li>Usando un loop invariante para probar la correctitud de un algoritmo </li></ul><ul><ul><li>Un loop invariante es una sentencia acerca de las variables de los algoritmos que nos ayuda a probar porque un algoritmo es correcto. Debemos probar 3cosas acerca de un loop invariante: </li></ul></ul>
  13. 13. <ul><li>INICIALIZACION </li></ul><ul><li>el loop invariante es cierto previo a la primera iteracion del loop. </li></ul><ul><li>MANTENIMIENTO </li></ul><ul><li>Si es cierto antes de una iteracion, permanece cierto antes de la proxima iteracion. </li></ul><ul><li>TERMINACION </li></ul><ul><li>Cuando el loop termina, el invariante da una propiedad util que nos ayuda a mostrar que el algoritmo es correcto ( usual/ usamos un loop invariante que en la terminacion implique la correctitud del algoritmo). </li></ul>
  14. 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. 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. 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. 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. 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. 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. 20. Cantidad de trabajo realizado <ul><li>Como mediremos la cantidad de trabajo realizada por un algoritmo? </li></ul><ul><li>La medida elegida debe permitirnos comparar dos algoritmos para el mismo problema y asi determinar cual es mas eficiente. Seria bueno que esa medida nos permitiera comparar aprox. los tiempos de ejecución, pero el tiempo de ejecución no lo usaremos ,porqué? Envez de esto podriamos contar todas las instrucciones ejecutadas por un programa, pero también aquí hay problemas, porqué?.. </li></ul><ul><li>Lo que queremos es algo que nos diga acerca de la eficiencia del método empleado por un algoritmo con independencia no solo del computador, el lenguaje de programación, el programador sino también de los múltiples detalles de implementacion (indices,apuntadores etc). </li></ul><ul><li>Para analizar un algoritmo podemos aislar una operación específica que sea fundamental para el problema que se estudia, asi hariamos caso omiso de inicializaciones, control de ciclos y demás tareas de contabilidad y simplemente contar las operaciones básicas que el algoritmo efectua.En tanto las operaciones básicas se escojan bien y el numero total de operaciones efectuadas sea aproximada/ proporcional al numero de operaciones básicas tendremos una buena medida del trabajo realizado por un algoritmo y un buen criterio para comparar varios algoritmos. </li></ul>
  21. 21. <ul><li>1o. En algunas situaciones puede interesarnos como operación básica una operación muy costosa comparada con las demás </li></ul><ul><li>2o.En muchos casos nos interesa la tasa de crecimiento del tiempo que el algoritmo requiere a medida que el tamaño de las entradas aumenta. En tanto que se cumpla la proporcionalidad de operaciones, bastará contar las básicas para tener una idea de que tan factible es aplicar un algoritmo a entrada grandes. </li></ul><ul><li>Podemos sustituir el término cantidad de trabajo por complejidad de un algoritmo. </li></ul><ul><li>COMPLEJIDAD  Cantidad de trabajo realizada medida según alguna medida de complejidad específica, que la mayoria de las veces será el número de operaciones básicas efectuadas </li></ul><ul><li>En consecuencia la cantidad de trabajo realizado no se puede describir con un solo número porque el número de pasos ejecutados no es el mismo con todas las entradas. Observemos que la cantidad de trabajo efectuada generalmente depende del tamaño de la entrada….Pero también observemos que incluso si el tamaño de las entradas fuera el mismo, el numero de operaciones efectuadas por un algoritmo podría depender de la naturaleza de las entradas . Necesitamos una medida de tamaño de las entradas de un problema el tiempo tomado por una algoritmo depende de la entrada </li></ul>
  22. 22. Como analizamos el tiempo de ejecución de un algoritmo <ul><li>Ordenar 1000 números toma mas tiempo que ordenar 3 números. </li></ul><ul><li>Un algoritmo de ordenamiento dado puede aun tomar cantidades diferentes de tiempo en dos entradas del mismo tamaño </li></ul><ul><li>Por ej. Veremos que ordenamiento X inserción toma menos tiempo para ordenar n elementos cuando ellos están ya ordenados que cuando ellos están en orden contrario . </li></ul><ul><li>Input size: Depende del problema que es estudiado. </li></ul><ul><li>Usual/, es el numero de items en la entrada. Como el tamaño n del arreglo a ser ordenado. </li></ul><ul><li>Pero podría ser algo mas. Por ej. Multiplicando dos enteros, podría ser el número total de bits en los dos enteros. </li></ul><ul><li>Podría ser descrito por mas de un numero por ejemplo: En algoritmos de grafos los tiempos de ejecución son usualmente expresados en términos del numero de vértices y el numero de arcos en el grafo de entrada </li></ul>
  23. 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. 24. Analisis del ordenamiento x Insercion <ul><li>procedimiento insercion( A[1..n] ) </li></ul><ul><li>for i  2 to n do </li></ul><ul><li>x  A[i] </li></ul><ul><li> inserte A[i] entre A[1,..,I-1] </li></ul><ul><li>j  i-1 </li></ul><ul><ul><li>while x<A[j] and j>0 do </li></ul></ul><ul><ul><li> A[j+1]  A[j] </li></ul></ul><ul><ul><li> j  j-1 </li></ul></ul><ul><li>end-while </li></ul><ul><ul><li>A[j+1]  x </li></ul></ul><ul><ul><li>end-for </li></ul></ul><ul><li>end </li></ul>El tiempo de ejecucion del algoritmo es
  25. 25. complejidad en tiempo <ul><li>costo veces </li></ul><ul><li>procedimiento insercion( A[1..n] ) </li></ul><ul><li>for i  2 to n do c 1 n </li></ul><ul><li>x  A[i] c 2 n-1 </li></ul><ul><li> insert A[i] into A[1,..,I-1] c 3 0 </li></ul><ul><li>j  i-1 c 4 n-1 </li></ul><ul><ul><li>while x<A[j] and j>0 do c 5  i=2,..,n t i </li></ul></ul><ul><ul><li> A[j+1]  A[j] c 6  i =2,..,n (t i -1) </li></ul></ul><ul><ul><li> j  j-1 c 7  i=2,..,n (t i -1) </li></ul></ul><ul><li>end-while </li></ul><ul><ul><li>A[j+1]  x c 8 n-1 </li></ul></ul><ul><ul><li>end-for </li></ul></ul><ul><li>end </li></ul>
  26. 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. 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. 28. Complejidad de tiempo en el caso Promedio t a (n) En este caso promedio t i = ( i+1 )/2 then t w (n) = c 1 n + (c 2 +c 4 +c 8 ) n-1 + c 5  i=2,..,n (i+1)/2 + (c 6 +c 7 )  i=2,..,n i/2 = an 2 +bn+c =  ( n 2 ). <ul><li>Si c i = 1 </li></ul><ul><li>t b (n) = 5 n-4 =  ( n ). </li></ul><ul><li>t w (n) = 3/4 n 2 + 17/ 4 n - 4 =  ( n 2 ) cuando la entrada es una permutacion aleatoria uniforme de 1 ..n sin repeticion </li></ul><ul><li>t w (n) = 3/2 n 2 + 7/2 n - 4 =  ( n 2 ). </li></ul>
  29. 29. Analisis del peor caso y del caso promedio <ul><li>Sea D n el conjunto de entradas de tamaño n para el problema en consideración, y sea I un elemento de D n . .Sea T(I) el número de operaciones básicas que el algoritmo ejecuta con la entrada I . Definimos la función </li></ul><ul><li>tw(n) = máx. {T(I) / I ε D n } </li></ul><ul><li>El tiempo de ejecución del peor caso es el tiempo de ejecución mas largo para una entrada de tamaño n.Este se constituye en un limite superior del tiempo de ejecución para alguna entrada, de esta forma nos da una garantia de que el algoritmo nunca tomara mas tiempo. </li></ul><ul><li>En algunos algoritmos el peor caso ocurre con bastante frecuencia, por ejemplo, buscar en una BD una información (el peor caso ocurre cuando la informacion no esta) </li></ul><ul><li>Sea Pr(I)la probabilidad de que se presente la entrada I  el comportamiento promedio del algoritmo se define asi: ta(n)= </li></ul><ul><li>El caso promedio es con frecuencia aproximadamente tan malo como el peor caso. Suponga que aleatoria/ escogemos n números y aplicamos ordenamiento por insercion.Cuánto tiempo toma determinar donde en el subarreglo A[1,,j-1] insertar el elemento A[j]? En promedio, la mitad de los elementos en A[1,,j-1] son menores que A[j] y la mitad de los elementos son mas grandes. En promedio, por esto, nosotros revisamos la mitad del subarreglo A[1,j-1] ,asi t j = j/2. Si planeamos el tiempo de ejecución del caso promedio resultante el vuelve a ser una función cuadrática del tamaño de la entrada, justo como el tiempo de ejecución del peor caso. </li></ul>
  30. 30. Orden de crecimiento <ul><li>Usamos algunas abstracciones para facilitar nuestro analisis del algoritmo de INSERCION. </li></ul><ul><li>Ignoramos el costo actual de cada sentencia usando las constantes c i para representar estos costos. </li></ul><ul><li>Observamos que aun estas constantes nos dan mas detalle del que necesitamos (Recuerde Tiempo para el peor caso an 2 + bn + c para algunas constantes a,b,c que dependen de los costos c i de las sentencias. </li></ul><ul><li>En conclusion ignoramos no unicamente los costos de las sentencias actuales, sino tambien los costos abstractos c i. </li></ul><ul><li>Ahora haremos una abstraccion mas simplificada: es la RATA DE CRECIMIENTO u ORDEN DE CRECIMIENTO del tiempo de ejecucion. Por esto consideramos solo los terminos ppales de una formula (e.g: an 2 ) ya que los terminos de orden inferior son relativamente insignificantes para n grande.Tambien ignoramos los coeficientes constantes de los terminos ppales, ya que factores constantes son menos significativos que la rata de crecimiento para entradas grandes .En conclusion escribimos que insercion, tiene un tiempo de ejecucion en el peor caso de . Usaremos informalmente la notacion theta y luego la definiremos. </li></ul><ul><li>Usual/ consideramos que un algoritmo es mas eficiente que otro si el tiempo de ejecucion de su peor caso tiene un orden de crecimiento mas bajo. </li></ul>
  31. 31. <ul><li>In summary </li></ul><ul><li>Order of growth </li></ul><ul><li>Another abstraction to ease analysis and focus on the important features. </li></ul><ul><li>Look only at the leading term of the formula for running time. </li></ul><ul><li>• Drop lower-order terms. </li></ul><ul><li>• Ignore the constant coefficient in the leading term. </li></ul><ul><li>Example: For insertion sort, we already abstracted away the actual statement costs </li></ul><ul><li>to conclude that the worst-case running time is a n 2 + bn + c . </li></ul><ul><li>Drop lower-order terms⇒ a n 2 . </li></ul><ul><li>Ignore constant coefficient ⇒n 2 </li></ul><ul><li>But we cannot say that the worst-case running time T (n) equals n 2. </li></ul><ul><li>It grows like n 2 . But it doesn’t equal n 2 . </li></ul><ul><li>We say that the running time is (n 2 ) to capture the notion that the order of growth is n 2 . </li></ul><ul><li>We usually consider one algorithm to be more efficient than another if its running time has a smaller order of growth. </li></ul>
  32. 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.
  33. 33. <ul><li>Suponga que en lugar de lo anterior decide invertir en algoritmia y que habiendo invertido la misma cantidad de dinero se las arregla para encontrar un algoritmo cúbico para el problema. Entonces con la máquina original y el algoritmo nuevo puede resolver un caso de tamaño n en 10 -2 x n 3 seg  para resolver un ejemplar de tamaño 10 requerirá 10 seg y uno de tamaño 20 seguirá entre uno y dos minutos, pero un ejemplar de tamaño 30 se podrá resolver en 4 minutos y medio y en un dia se pueden resolver casos de tamaño mayor a 200. En un año un ejemplar de tamaño casi 1500. </li></ul><ul><li>Como sería el nuevo algoritmo en la nueva máquina comparado con lo anterior??????????? </li></ul>
  34. 34. CUANDO QUEDA ESPECIFICADO UN ALGORITMO <ul><li>Deciamos que la ejecucion de un algoritmo no debia implicar decisiones subjetivas </li></ul><ul><li>Que se debia estar contento si un algoritmo funcionaba en abstracto </li></ul><ul><li>Proponiamos considerar la mayoria de las operaciones aritmeticas como elementales a no ser que dijeramos lo contrario. </li></ul><ul><li>Desafortunadamente las consideraciones practicas nos llevan a tener en cuenta las limitaciones de las maquinas.Por ej. Un algoritmo que deba calcular el valor exacto de fib(100) se vera obligado a considerar que ciertas operaciones aritmeticas, no son elementales(fib(100) es un # con 21 digitos). Si no especificamos como se debe implementar la operación de precision multiple, el algoritmo estara especificado incompletamente . Existen algoritmos cuyo rendimiento dependera del metodo que se use para multiplicar ,por ej, por eso no basta con escribir una instrucción como x  y * z dejando que se seleccione cualquier tecnica para implementar la multiplicacion, por eso se debe especificar la forma en que se deben implementar las op. Aritmeticas necesarias. </li></ul><ul><li>Sin embargo, seguiremos dejando descripciones incompletas. Los detalles se trataran posteriormente, si es que los analisis asi lo requieren. </li></ul>
  35. 35. Ejercicio <ul><li>Para el algoritmo de selección , que loop invariante este algoritmo mantiene? </li></ul><ul><li>Porque necesita correr para unicamente los primeros n -1 elementos, preferiblemente que para todos los n elementos. De los tiempos de ejecucion para el peor caso,y el mejor caso en notacion theta ( ) </li></ul>

×