Tema 5: Estudio de costes computacionales Contenido 1. Introducción 2. Definiciones 3. Coste de algoritmos iterativos 2/16 DSIC Tema 5 1. Introducción ● ● ● Para resolver un problema determinado se pueden encontrar diferentes soluciones (algoritmos) . Las soluciones pueden ser mejores, peores o imposibles de llevarlas al mundo real. Mejor o peor, ¿ respecto a qué ? ● Coste espacial ● Coste computacional Teleco - Programación 3/16 DSIC Tema 5 2. Definiciones ● ● Talla de un problema: el parámetro o conjunto de parámetros que representan el volumen de datos del problema. ¿ Como es de grande el problema? En función de la talla del problema se tiene: ● ● Eficiencia espacial de un algoritmo: es una medida de la cantidad de memoria necesaria para resolver el problema. Eficiencia temporal de un algoritmo: es una medida del tiempo necesario para ejecutar un algoritmo. Teleco - Programación 4/16 DSIC Tema 5 2. Definiciones ● ● Debido a la evolución de los dispositivos de memoria, la eficiencia espacial ha pasado a ser menos importante que la temporal por lo que nos centraremos en ella. Es importante que las medidas dependan solamente del algoritmo y no del ordenador en que se ejecute. Teleco - Programación 5/16 DSIC Tema 5 3. Coste de alg. iterativos ● ● Las operaciones que tarden lo mismo independientemente de la talla se consideran constantes Ej. búsqueda lineal. La talla es la dimensión del vector. int busca1 (elemento vec, tipo1 val){ int busca1 (elemento vec, tipo1 val){ int i ; int i ; i = -1 ; i = -1 ; do { do { i++ ; i++ ; } while ((vec[i].clave!=val) && (i != N-1)) ; } while ((vec[i].clave!=val) && (i != N-1)) ; if (vec[i].clave == val) if (vec[i].clave == val) return i ; return i ; else else return -1 ; return -1 ; } } } } Teleco - Programación 6/16 DSIC Tema 5 3. Coste de alg. iterativos ● Las operaciones que tarden lo mismo independientemente de la talla se consideran constantes int busca1 (elemento vec, tipo1 val){ int busca1 (elemento vec, tipo1 val){ int i ; k1 int i ; k2 i = -1 ; i = -1 ; do { do { i++ ; k3 i++ ; } while ((vec[i].clave!=val) && (i != N-1)) ; } while ((vec[i].clave!=val) && (i != N-1)) ; if (vec[i].clave == val) if (vec[i].clave == val) return i ; k5 return i ; else else return -1 ; k6 return -1 ; } } } } Teleco - Programación k4 7/16 DSIC Tema 5 3. Coste de alg. iterativos ● Bloques de operaciones constantes que no estén dentro de bucles suman constante. int busca1 (elemento vec, tipo1 val){ int busca1 (elemento vec, tipo1 val){ int i ; int i ; k7 i = -1 ; i = -1 ; do { do { i++ ; k3 i++ ; } while ((vec[i].clave!=val) && (i != N-1)) ; } while ((vec[i].clave!=val) && (i != N-1)) ; if (vec[i].clave == val) if (vec[i].clave == val) return i ; return i ; k8 else else return -1 ; return -1 ; } } } } Teleco - Programación 8/16 DSIC Tema 5 3. Coste de alg. iterativos ● Bucles hace que el coste de su cuerpo se repita las veces que buclea. int busca1 (elemento vec, tipo1 val){ int busca1 (elemento vec, tipo1 val){ int i ; int i ; i = -1 ; i = -1 ; do { do { i++ ; k3*rep i++ ; } while ((vec[i].clave!=val) && (i != N-1)) ; } while ((vec[i].clave!=val) && (i != N-1)) ; if (vec[i].clave == val) if (vec[i].clave == val) return i ; return i ; else else return -1 ; return -1 ; } } } } Teleco - Programación 9/16 DSIC Tema 5 3. Coste de alg. iterativos ● El coste del algoritmo en función de los datos es pues: K7 K7 K3*rep K3*rep ++K8 K8 --------------------------------K7+K8+K3*rep K7+K8+K3*rep --------------------------------K9+K3*rep K9+K3*rep /*/*K7+K8=K9*/ K7+K8=K9*/ Teleco - Programación 10/16 DSIC Tema 5 3. Coste de alg. iterativos ● El coste depende del número de ciclos que de el bucle. ● Dependiendo de los datos ¿el número de ciclos puede ser distinto? ● Si sí, hay que calcular el coste para el mejor y el peor caso. ● Mejor caso: El elemento a buscar está el primero ● ● Costemejor(n)= K9+K3*1 = K9+K3 = K10 Peor caso: El elemento no está. El número de ciclos es igual a la talla del vector. ● Costepeor(n)=K9+K3*n Teleco - Programación 11/16 DSIC Tema 5 3. Coste de alg. iterativos ● En el cálculo de costes se suele obtener una serie de factores sumados. El coste total se tomará como el mayor factor según la siguiente tabla: k log(n) n n log (n) n2 n3 np para p>3 kn n! Teleco - Programación constantes logarítmicos lineales quasilineales cuadráticos cúbicos polinómicos exponenciales factoriales 12/16 DSIC Tema 5 3. Coste de alg. iterativos Teleco - Programación 13/16 DSIC Tema 5 3. Coste de alg. iterativos Tiempos de ejecución en una máquina que ejecuta 10 9 pasos por segundo (1 GHz), en función del coste del algoritmo y de la talla del problema: Talla 10 20 30 40 50 100 1000 10000 100000 1000000 log2 n 3.322 ns 4.322 ns 4.907 ns 5.322 ns 5.644 ns 6.644 ns 10 ns 13 ns 17 ns 20 ns n log2 n n 10 ns 20 ns 30 ns 1 ms 50 ns 100 ns 1 ms 10 µs 100 µs 1 ms 33 ns 86 ns n log2 n 213 ns 282 ns 664 ns 10 µs 133 µs 2 ms 20 ms Teleco - Programación n2 100 ns 400 ns 900 ns 2 µs 3 µs 10 µs 1 ms 100 ms 10 s 16.7 min n3 1 µs 8 µs 27 µs 64 µs 125 µs 1 ms 1s 16.7 m 11.6 dias 31.7 años 2n 1 µs 1 ms 1s 18.3 min 13 dias 40 · 1012 años 14/16 DSIC Tema 5 3. Coste de alg. iterativos ● El procedimiento general para calcular los costes de un algoritmo es el siguiente: 1.1.Definir Definirlalatalla talladel delproblema. problema.¿¿de dequé qué depende dependeeleltamaño tamañode deproblema? problema? 2.2.¿¿Existen Existencomportamientos comportamientosdistintos distintos dependiendo dependiendode delos losdatos datos?? 2.1. 2.1.SiSilos loshay: hay:calcular calcularelelcoste coste para paraelelcaso casomejor mejoryypara paraelel caso casopeor. peor. 2.2. 2.2.SiSino nolos loshay: hay:calcular calcularun unsólo sólo resultado. resultado. Teleco - Programación 15/16 DSIC Tema 5 3. Coste de alg. iterativos ● Calcula la función de coste temporal para las funciones calculaVar1 y calculaVar2 float calculaMedia(float * vec, int tam){ float * vec, int tam){ floatcalculaMedia(float sum; intfloat i; sum; int i; float calculaMedia(float * vec, int tam){ float * vec, int tam){ floatcalculaMedia(float sum; intfloat i; sum; int i; for (i=0; i<tam; i++) forsum+=vec[i]; (i=0; i<tam; i++) sum+=vec[i]; for (i=0; i<tam; i++) forsum+=vec[i]; (i=0; i<tam; i++) sum+=vec[i]; return sum/tam; } return sum/tam; } return sum/tam; } return sum/tam; } float calculaVar1(float * vec, int tam){ float * vec, int tam){ floatcalculaVar1(float media; floatsum=0; media; float float int i; sum=0; int i; media=calculaMedia(vec,tam); media=calculaMedia(vec,tam); for (i=0; i<tam; i++) forsum+=(vec[i] (i=0; i<tam; i++) - media) * (vec[i] - media); sum+=(vec[i] - media) * (vec[i] - media); return sum/tam; } return sum/tam; } float calculaVar2(float *vec, int tam){ float *vec, int tam){ floatcalculaVar2(float media; floatsum=0; media; float float int i; sum=0; int i; for (i=0; i<tam; i++) forsum+=(vec[i] (i=0; i<tam; i++) - calculaMedia(vec,tam)) * sum+=(vec[i] - calculaMedia(vec,tam)) * (vec[i] - calculaMedia(vec,tam)); (vec[i] - calculaMedia(vec,tam)); return sum/tam; } return sum/tam; } Teleco - Programación 16/16