Tema 5: Estudio de costes computacionales

Anuncio
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
Descargar