0
Análisis y Diseño      de SoftwareTema 2a. Eficiencia yComplejidadCarlos A. Iglesias <cif@gsi.dit.upm.es>Departamento de I...
LeyendaTeoríaEjercicio práctico en el ordenador / ProblemaAmpliación de conocimientosLectura / Vídeo / PodcastPráctica lib...
Bibliografía●   Eficiencia algorítmica    –   http://en.wikipedia.org/wiki/Algorithmic_efficien        cy    –   http://en...
Temario●   Complejidad: el problema●   Espacio de problemas●   Notación O (Big O)●   Evaluar la complejidad de un algoritm...
Objetivos● Entender cómo se pueden comparar algoritmos● Entender qué es una medida de complejidad● Conocer la notación O● ...
El problema●   ¿En qué nos    basamos para    seleccionar un    algoritmo cuando    hay tantos    disponibles (y tan    pa...
¿Qué elegir?● “Encasi todos los cálculos,es posible una granvariedad en la forma de dellevar a cabo los procesosde computa...
¿Qué elegir?●   El algoritmo más    eficiente●    Eficiencia:    inversamente    proporcional a los    recursos (memoria, ...
Formas de seleccionar●   De forma empírica:    –   Medimos su recursos consumidos de los        algoritmos (tiempo, memori...
Medidas empíricas●   Medimos (p.ej. Tiempo).      // Creo el entorno      Algoritmo a = new Algoritmo();      Datos d = ne...
Medidas empíricas● Como los algoritmos son genéricos, las medidas empíricas pueden verse afectadas por:  –    El lenguaje ...
Medidas teóricas: notación O      (Big O Notation)● Nos ayuda a clasificar algoritmos según cómo crezca su respuesta (tiem...
Orden de complejidad  ●    f(n) = O(g(n)) significa que C*g(n) es un      límite superior de f(n) para un n o y C      pos...
Orden de complejidad●Realmente cuando decimos n2=O(n3) lo que estamos diciendo es que  –   O(n3) es un conjunto de funcion...
Funciones de ReferenciaFunción            Nombreg(n) = 1           Constanteg(n) = log(n)      Logarítmicog(n) = n        ...
Propiedades O(n)●Adición        O( g (n))+O( f (n))→O (max ( f ( n) , g (n)))    –   Ej. n3+n2+n+1 = O(n3), importa el tér...
Definición alternativa●   Otra forma de definir que g>>n        ∣ f (n)∣≤C ∣g (n)∣ , ∀ n> n0                              ...
Comparando funciones          f (n)    lim         =0 si f (n)es menos compleja que g ( n)    n→∞ g ( n)           f (n)  ...
Órdenes de funciones                    comunesNotación       Nombre        ComentarioO(1)           Constante     IdealO(...
Orden   Eficiencia y Complejidad   20
O(1): complejidad constante●    Complejidad constante, independiente del    tamaño de la entrada    boolean isElementoNulo...
O(logn) - Logarítmico● logb(Y):         Número de veces que Y se puede dividir por b hasta que vale 1. Inverso de la expon...
O(logn)●Ej.  búsqueda binaria. Buscamos un número en el listín telefónico ordenado alfabéticamente. Dividimos entre dos el...
O(n): lineal● Consumo de recursos directamente proporcional a la entrada● Ej. búsqueda lineal. Caso peor: buscamos el últi...
O(n ): polinómico             c●Ahora  el orden sí es importante●Normalmente se da si hacemos un cálculo con un elemento y...
O(c ): exponencial              n●También   es relevante el exponente                        Eficiencia y Complejidad   26
¿Cómo calculamos la           complejidad? (I)●Analizamos     el código● Ensentencias condicionales (if/else-switch), coge...
¿Complejidad?       Eficiencia y Complejidad   28
¿Cómo calculamos la          complejidad? (II)●Si el bucle es multiplicativo, es decir, no es lineal con n:  int c = 1;   ...
¿Cómo calculamos la             complejidad? (II)●Si   combinamos, nos sale O(nlogn):      for (int i = 0; i < n; i++) {  ...
Ejemplo. Calcular complejidad (I)         Eficiencia y Complejidad   31
Ejemplo (II)    Se ejecuta n (= coef.length) veces (0 a n - 1)           Eficiencia y Complejidad                  32
Ejemplo (III)  Para cada i, se ejecuta i – 1 veces  Es decir, 0 + 1 + 2 + … + n – 2 = (n – 2 + 1) / 2  = (n – 1) / 2      ...
Ejemplo (IV)   En total, se ejecuta n * (n – 1) / 2 → O(n2)           Eficiencia y Complejidad               34
Optimizamos      Eficiencia y Complejidad   35
Complejidad potencia (I)●Si    siempre tomara la rama impar, se    ejecutaría y -1, y – 2, … 0 → O(n)                     ...
Complejidad potencia (II)●   Como vamos restando uno, una vez irá a    una rama y otra vez a la otra rama●   Ej. x^31: 31,...
Complejidad           evaluaPolinomio2●   Tenemos un bucle que sucede n veces,    donde se llama a potencia → O(nlogn)    ...
Complejidad           evaluaPolinomio3●   Almacenamos las potencias●   Ahora el bucle se ejecuta n veces → O(n)           ...
Complejidad           evaluaPolinomio4●Misma     complejidad que antes, O(n)●   Sin embargo, sólo ejecuta N sumas y    mul...
Medimos tiempos●   Para N: 10, 100, 500, 1000●   Calculamos coeficientes aleatorios y    ejecutamos 10.000 veces          ...
Medimos tiemposN     EvaluaPolinomio1 EvaluaPolinomio2     EvaluaPolinomio3    EvaluaPolinomio410    18               24  ...
Fibonacci1 – recursivo● fib(n) es función de fib(n-1)+fib(n-2)● Muy difícil calcular la complejidad                       ...
Fibonacci1 - Truco●   Sea T(n) el tiempo de ejecución●   Si suponemos que T(n) es exponencial:             T (n)=T (n−1)+T...
Fibonacci1●   Si E(n) es el Espacio en Memoria ocupado,    ¿cuál es su complejidad?                                       ...
Comprobamos                                       f (n)●   Se cumple el límite            lim        =k                   ...
Fibonacci-2 iterativo●   Tenemos un bucle que se ejecuta n-3    veces, con que...                                       T ...
Fibonacci-3 con memoria●   ¿Complejidad? Si nos fijamos, cómo    vamos guardando valores, sólo calculamos    1 vez cada va...
Fibonacci3 recursivo con            memoria                                              fib(n)                           ...
Memoria vs tiempo●    En este caso    gastamos más    memoria: E(n) →    O(n) datos    memorizados para    ahorrar tiempo ...
Variante: Recursivo con      memoria limitada●Limitamos   el buffer a los n más usados (de 0an-1                          ...
Fibonacci4 – fórmula de Binet●   No depende de n → T(n), E(n) → O(1)                                             Binet (17...
Tiempos    Eficiencia y Complejidad   53
Tipos de problemas●   Hay muchos problemas que no sabemos    un algoritmo para resolverlos.●   Entre los que sabemos resol...
Comprobación empírica●   Una vez que tomamos las medidas,    podemos intentar ver se ajustan a una    complejidad conocida...
Ejemplo    Eficiencia y Complejidad   56
Cambio x=n        2      Eficiencia y Complejidad   57
Cambio x=nlog(n)        Eficiencia y Complejidad   58
Resumen●   Para elegir un algoritmo, podemos    –   Seguir un enfoque analítico y corroborar        empíricamente    –   S...
Notación O     Eficiencia y Complejidad   60
Preguntas● Sipruebo dos algoritmos en mi ordenador, y uno tarda 10 segundos y otro 20 segundos, ¿cuál es más eficiente?   ...
Upcoming SlideShare
Loading in...5
×

Tema 2 eficiencia y complejidad

643

Published on

Apuntes complejidad

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
643
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Tema 2 eficiencia y complejidad"

  1. 1. Análisis y Diseño de SoftwareTema 2a. Eficiencia yComplejidadCarlos A. Iglesias <cif@gsi.dit.upm.es>Departamento de Ingeniería de Sistemas Telemáticos http://moodle.dit.upm.es
  2. 2. LeyendaTeoríaEjercicio práctico en el ordenador / ProblemaAmpliación de conocimientosLectura / Vídeo / PodcastPráctica libre / Experimentación Eficiencia y Complejidad 2
  3. 3. Bibliografía● Eficiencia algorítmica – http://en.wikipedia.org/wiki/Algorithmic_efficien cy – http://en.wikipedia.org/wiki/Analysis_of_algorith ms#Shortcomings_of_empirical_metrics● http://jungla.dit.upm.es/~pepe/doc/adsw/Complejidad.pdf Eficiencia y Complejidad 3
  4. 4. Temario● Complejidad: el problema● Espacio de problemas● Notación O (Big O)● Evaluar la complejidad de un algoritmo● Análisis y conclusiones Eficiencia y Complejidad 4
  5. 5. Objetivos● Entender cómo se pueden comparar algoritmos● Entender qué es una medida de complejidad● Conocer la notación O● Conocer la notación O para algoritmos básicos de ordenación y búsqueda● Saber razonar con la notación O Eficiencia y Complejidad 5
  6. 6. El problema● ¿En qué nos basamos para seleccionar un algoritmo cuando hay tantos disponibles (y tan parecidos)? Eficiencia y Complejidad 6
  7. 7. ¿Qué elegir?● “Encasi todos los cálculos,es posible una granvariedad en la forma de dellevar a cabo los procesosde computación. […] Esesencial seleccionar laforma que reduzca almínimo el tiempo paracompletar un cálculo”Ada Lovelace Eficiencia y Complejidad 7
  8. 8. ¿Qué elegir?● El algoritmo más eficiente● Eficiencia: inversamente proporcional a los recursos (memoria, tiempo, …) consumidos por un algoritmo Eficiencia y Complejidad 8
  9. 9. Formas de seleccionar● De forma empírica: – Medimos su recursos consumidos de los algoritmos (tiempo, memoria, uso de comunicaciones, disco, consumo energético, …, caso mejor, peor, medio, …)● De forma analítica / teórica: – Calculamos un límite de estos recursos, analizando el algoritmo y su implementación Eficiencia y Complejidad 9
  10. 10. Medidas empíricas● Medimos (p.ej. Tiempo). // Creo el entorno Algoritmo a = new Algoritmo(); Datos d = new Datos(); // relleno // Mido long t1 = System.nanoTime(); a.run(d); long t2 = System.nanoTime(); long duracion = t2 – t1; Eficiencia y Complejidad 10
  11. 11. Medidas empíricas● Como los algoritmos son genéricos, las medidas empíricas pueden verse afectadas por: – El lenguaje de programación – El entorno de ejecución / sistema operativo (p.ej. JVM GC, multinúcleo, …) – Los datos que usemos al medir● Pueden ayudarnos a entender cómo funcionan, y tenemos que analizar bien el experimento cuando obtenemos resultados inesperados● Simedimos, podemos intentar ajustar las gráficas, y ver qué distribución siguen (polinómico, lineal, etc.). Si estás interesado, mira los apuntes. Eficiencia y Complejidad 11
  12. 12. Medidas teóricas: notación O (Big O Notation)● Nos ayuda a clasificar algoritmos según cómo crezca su respuesta (tiempo de ejecución, memoria, etc.) con el número de datos de entrada● Algoritmos con la misma “respuesta”, tendrán la misma notación O● Representa la cota del valor peor que pueden tomar, el límite superior Eficiencia y Complejidad 12
  13. 13. Orden de complejidad ● f(n) = O(g(n)) significa que C*g(n) es un límite superior de f(n) para un n o y C positivos∣ f (n)∣≤C ∣g (n)∣ , ∀ n> n0Ej. 3n 2 −100n+6=O (n 2 ) , porque 3n 2 >3n 2 −100n+6 cuando n>0Ej. 3n 2 −100n+6=O (n3 ) , porque n3 >3n 2 −100n+6 cuando n>3Ej. 3n 2 −100n+6≠O (n) , porque para todo c que escojo cn<3n 2 cuando n>c Eficiencia y Complejidad 13
  14. 14. Orden de complejidad●Realmente cuando decimos n2=O(n3) lo que estamos diciendo es que – O(n3) es un conjunto de funciones – f(n) = n2 es una de las funciones que pertenecen a esta clase de funciones de complejidad O(n3)●Otra forma de verlo es decir que f(n) = O(g(n)) se lee como g domina a f: g ≫n● Nos basta una función de referencia por clase Eficiencia y Complejidad 14
  15. 15. Funciones de ReferenciaFunción Nombreg(n) = 1 Constanteg(n) = log(n) Logarítmicog(n) = n Linealg(n) = n *log(n) Lineal logarítmicog(n) = n2 Cuadráticog(n) = nc Potencialg(n) = cn, n >1 Exponencialg(n) = n! Factorial n! ≫c n ≫n 2 ≫nc ≫nlogn≫n≫logn≫1 Eficiencia y Complejidad 15
  16. 16. Propiedades O(n)●Adición O( g (n))+O( f (n))→O (max ( f ( n) , g (n))) – Ej. n3+n2+n+1 = O(n3), importa el término mayor si n → ∞● Factor multiplicador O(cf ( n))→O ( f (n)) – Puedo multiplicar por 1/c al hacer el análisis Eficiencia y Complejidad 16
  17. 17. Definición alternativa● Otra forma de definir que g>>n ∣ f (n)∣≤C ∣g (n)∣ , ∀ n> n0 f (n) f (n)=O( g (n))={ f (n) , lim <∞} n→∞ g (n)●El conjunto incluye las funciones f(n) que son menos complejas que g(n) y las que son igual de complejas que g(n) Eficiencia y Complejidad 17
  18. 18. Comparando funciones f (n) lim =0 si f (n)es menos compleja que g ( n) n→∞ g ( n) f (n) lim =∞ si f ( n) es más compleja que g (n) n→ ∞ g (n) f (n)lim =k si f (n)tiene misma complejidad que g (n)n→ ∞ g ( n) Eficiencia y Complejidad 18
  19. 19. Órdenes de funciones comunesNotación Nombre ComentarioO(1) Constante IdealO(log n) Logarítmico Muy buenoO(n) Lineal normalO(nlogn) Lineal razonable logarítmicoO(n2) Cuadrático tratableO(nc) Potencial “tratable”O(cn), n >1 Exponencial No es prácticoO(n!) Factorial inviable Eficiencia y Complejidad 19
  20. 20. Orden Eficiencia y Complejidad 20
  21. 21. O(1): complejidad constante● Complejidad constante, independiente del tamaño de la entrada boolean isElementoNulo(Object [] array, int indice) { if (a[indice] == null) { return true; } return false; } boolean isElementoNulo(Object [] array, int indice) { return (a[indice] == null); } Eficiencia y Complejidad 21
  22. 22. O(logn) - Logarítmico● logb(Y): Número de veces que Y se puede dividir por b hasta que vale 1. Inverso de la exponencial.● Ej.24 = 2 * 2 * 2 * 2 = 16● log2(16) : 16/2=8; 8/2=4; 4/2=2; 2/2=1--> 4 veces--> log2(16)= 4● Como log(nc) = c * log(n) ambos tienen la misma notación O, no nos importa el exponente de n.●Lo mismo con la base, como logc(b) = logc(a)*loga(b), no importa la base Eficiencia y Complejidad 22
  23. 23. O(logn)●Ej. búsqueda binaria. Buscamos un número en el listín telefónico ordenado alfabéticamente. Dividimos entre dos el listín y vamos a la mitad donde está si no está, dividimos otra vez.● El caso peor es el número de veces que dividimos n por 2 → log2(n) → O(logn) Eficiencia y Complejidad 23
  24. 24. O(n): lineal● Consumo de recursos directamente proporcional a la entrada● Ej. búsqueda lineal. Caso peor: buscamos el último elemento, recorremos n → O(n) Eficiencia y Complejidad 24
  25. 25. O(n ): polinómico c●Ahora el orden sí es importante●Normalmente se da si hacemos un cálculo con un elemento y con el resto de elementos● Ej. Ordenar método de la burbuja O(n2).●Comparaciones: (N – 1) + (N – 2) + … + 1 = N * (N-1)/2 → O(N2) Eficiencia y Complejidad 25
  26. 26. O(c ): exponencial n●También es relevante el exponente Eficiencia y Complejidad 26
  27. 27. ¿Cómo calculamos la complejidad? (I)●Analizamos el código● Ensentencias condicionales (if/else-switch), cogemos la rama peor●Bucles: – Si el bucle no depende de n, simplemente es una cte O(1), que quitamos – Si el bucle depende de n, tendremos O(n) – Si tenemos bucles anidados, que dependen de n, si son dos, tenemos O(n2) (nos sale 1 + 2 + .. = n(n-1)/2) Eficiencia y Complejidad 27
  28. 28. ¿Complejidad? Eficiencia y Complejidad 28
  29. 29. ¿Cómo calculamos la complejidad? (II)●Si el bucle es multiplicativo, es decir, no es lineal con n: int c = 1; Para n = 10: while (c < n) { c= 1, c = 2, c = 4, c= 8 sentencias O(1); En general, vale 2k <= n c *= 2; → k = log2(n) → log(n) } int c = n; while (c > 1) { Para n = 10: sentencias O(1); c= 10, c = 5, c = 2, c= 1 c /= 2; → log(n) } Eficiencia y Complejidad 29
  30. 30. ¿Cómo calculamos la complejidad? (II)●Si combinamos, nos sale O(nlogn): for (int i = 0; i < n; i++) { int c = i; while (c > 0) { sentencias O(1); c /= 2; } } Eficiencia y Complejidad 30
  31. 31. Ejemplo. Calcular complejidad (I) Eficiencia y Complejidad 31
  32. 32. Ejemplo (II) Se ejecuta n (= coef.length) veces (0 a n - 1) Eficiencia y Complejidad 32
  33. 33. Ejemplo (III) Para cada i, se ejecuta i – 1 veces Es decir, 0 + 1 + 2 + … + n – 2 = (n – 2 + 1) / 2 = (n – 1) / 2 Eficiencia y Complejidad 33
  34. 34. Ejemplo (IV) En total, se ejecuta n * (n – 1) / 2 → O(n2) Eficiencia y Complejidad 34
  35. 35. Optimizamos Eficiencia y Complejidad 35
  36. 36. Complejidad potencia (I)●Si siempre tomara la rama impar, se ejecutaría y -1, y – 2, … 0 → O(n) 2 4● Si siempre fuera la impar, y /4, y /16, … k k y /2 → O(logn) Eficiencia y Complejidad 36
  37. 37. Complejidad potencia (II)● Como vamos restando uno, una vez irá a una rama y otra vez a la otra rama● Ej. x^31: 31, 30, 15, 14, 7, 6, 3, 2, 1● Caso peor: que empiece con un impar● Como vamos dividiendo por 2 en la parte impar, tendremos log2(y) términos y otro tanto de términos impares. En total: 2*log 2(y)● → Potencia tiene complejidad O(logn) Eficiencia y Complejidad 37
  38. 38. Complejidad evaluaPolinomio2● Tenemos un bucle que sucede n veces, donde se llama a potencia → O(nlogn) Eficiencia y Complejidad 38
  39. 39. Complejidad evaluaPolinomio3● Almacenamos las potencias● Ahora el bucle se ejecuta n veces → O(n) Eficiencia y Complejidad 39
  40. 40. Complejidad evaluaPolinomio4●Misma complejidad que antes, O(n)● Sin embargo, sólo ejecuta N sumas y multiplicaciones (el anterior 2N multiplicaciones y N sumas, tarda el doble pero misma complejidad) Eficiencia y Complejidad 40
  41. 41. Medimos tiempos● Para N: 10, 100, 500, 1000● Calculamos coeficientes aleatorios y ejecutamos 10.000 veces Eficiencia y Complejidad 41
  42. 42. Medimos tiemposN EvaluaPolinomio1 EvaluaPolinomio2 EvaluaPolinomio3 EvaluaPolinomio410 18 24 13 1750 68 82 28 28100 231 240 42 45500 3901 1375 68 721000 18546 3981 107 108 Eficiencia y Complejidad 42
  43. 43. Fibonacci1 – recursivo● fib(n) es función de fib(n-1)+fib(n-2)● Muy difícil calcular la complejidad Eficiencia y Complejidad 43
  44. 44. Fibonacci1 - Truco● Sea T(n) el tiempo de ejecución● Si suponemos que T(n) es exponencial: T (n)=T (n−1)+T (n−2) T (n)=a n n n−1 n−2 a =a +a a 2 =a+1 √5 a=1+ ≃1.618 2 fib(n)≃1.6 n n O ( fib (n))∈O(1.6 ) Eficiencia y Complejidad 44
  45. 45. Fibonacci1● Si E(n) es el Espacio en Memoria ocupado, ¿cuál es su complejidad? fib(n) fib(n-1) fib(n-2) ... fib(n-2) fib(n-3) ... ... fib(0) E (n)∈O (n)( pila de llamadas) Eficiencia y Complejidad 45
  46. 46. Comprobamos f (n)● Se cumple el límite lim =k n→∞ g ( n) Eficiencia y Complejidad 46
  47. 47. Fibonacci-2 iterativo● Tenemos un bucle que se ejecuta n-3 veces, con que... T (n)∈O( n) E (n)∈O (1) Eficiencia y Complejidad 47
  48. 48. Fibonacci-3 con memoria● ¿Complejidad? Si nos fijamos, cómo vamos guardando valores, sólo calculamos 1 vez cada valor, con que es O(n) T (n)∈O( n) E (n)∈O (n)(datos) Eficiencia y Complejidad 48
  49. 49. Fibonacci3 recursivo con memoria fib(n) fib(n-1) fib(n-2) fib(n-2) fib(n-3) ... fib(2) T (n)∈O( n)fib(1) fib(0) E (n)∈O (n)(datos) Eficiencia y Complejidad 49
  50. 50. Memoria vs tiempo● En este caso gastamos más memoria: E(n) → O(n) datos memorizados para ahorrar tiempo (y no recalcular valores)● Es una técnica habitual para optimizar (caché) Eficiencia y Complejidad 50
  51. 51. Variante: Recursivo con memoria limitada●Limitamos el buffer a los n más usados (de 0an-1 Complejidad Tiempo de ejecución difícil de calcular, depende de cómo de grande sea n Eficiencia y Complejidad 51
  52. 52. Fibonacci4 – fórmula de Binet● No depende de n → T(n), E(n) → O(1) Binet (1786- 1856) Eficiencia y Complejidad 52
  53. 53. Tiempos Eficiencia y Complejidad 53
  54. 54. Tipos de problemas● Hay muchos problemas que no sabemos un algoritmo para resolverlos.● Entre los que sabemos resolver, los tipos más importantes son: – Problemas P: Problemas con complejidad polinómica (O(n), O(n2), etc.) – Problemas NP: Problemas que no pueden resolverse en un tiempo polinómico, e intentamos buscar otro algoritmo. Eficiencia y Complejidad 54
  55. 55. Comprobación empírica● Una vez que tomamos las medidas, podemos intentar ver se ajustan a una complejidad conocida●Hacemos un cambio de variable en el eje X y vemos si nos sale una recta Eficiencia y Complejidad 55
  56. 56. Ejemplo Eficiencia y Complejidad 56
  57. 57. Cambio x=n 2 Eficiencia y Complejidad 57
  58. 58. Cambio x=nlog(n) Eficiencia y Complejidad 58
  59. 59. Resumen● Para elegir un algoritmo, podemos – Seguir un enfoque analítico y corroborar empíricamente – Seguir un enfoque empírico● La notación O nos facilita razonar sobre la eficiencia de un algoritmo Eficiencia y Complejidad 59
  60. 60. Notación O Eficiencia y Complejidad 60
  61. 61. Preguntas● Sipruebo dos algoritmos en mi ordenador, y uno tarda 10 segundos y otro 20 segundos, ¿cuál es más eficiente? sé que un algoritmo tiene una respuesta 9n 3 + 2n2 +● Si 4n +2, ¿cuál sería su notación O?● ¿Qué significa que O es el límite asintótico?● Si tienes unos algoritmos A, B, C con complejidad O(n), O(nlogn) y O(n2), ¿en qué orden los escogerías?● Para cualquier valor de n, será siempre más rápido un algoritmo O(n)) que uno con O(n 2) Eficiencia y Complejidad 61
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×