Académique Documents
Professionnel Documents
Culture Documents
1.
Objetivo. ............................................................................................................................ 2
2.
3.
Enunciado. ........................................................................................................................ 2
4.
4.1.1.
4.1.1.1.
4.1.1.2.
4.1.1.3.
4.1.1.4.
Conclusin: ................................................................................................ 3
4.1.2.
4.2.
4.1.2.1.
4.1.2.2.
4.1.2.3.
4.1.2.4.
Conclusin: ................................................................................................ 5
4.2.1.
4.2.2.
Conclusiones. .......................................................................................................... 11
5.
6.
1/12
1.
Objetivo.
2.
Para analizar la eficiencia se mostrar como realizar un anlisis del algoritmo mediante estudio terico y
emprico. Este estudio ser requerido en el resto de prcticas de la asignatura.
El anlisis del algoritmo conlleva:
Estudio terico: En vista de la implementacin, habr que obtener la expresin de la funcin
complejidad temporal (T(n)) correspondiente al algoritmo.
Estudio Emprico: estudiar experimentalmente el comportamiento del algoritmo. Para ello mediremos
el tiempo para cada tamao dado de las entradas, obteniendo los puntos de la funcin complejidad para
los casos peor, mejor y medio (o nico si no es por casos).
Conclusin: para finalizar el anlisis habr que realizar una grfica para cada una de las tres funciones
obtenidas en el estudio emprico, si el anlisis es por casos (sino slo una), y comentarlas, es decir, si
son coherentes el resultado emprico con el terico obtenido, justificando la respuesta.
3.
Enunciado.
En esta prctica realizaremos el estudio terico y prctico para los algoritmos de Bsqueda Lineal
(secuencial) y Ordenacin por Burbuja vistos en clase.
4.
Estudio prctico.
1)
2)
n OE
1
4
3)
4)
5)
}
if (T[i]==valor)
6)
7)
return i;
else return -1;
1
1
i=i+1;
asignacin
Cond.Bucle(2comp.,1 acceso
vector, 1 lgica)
incremento y asignacin
1 condicin y 1 acceso al
vector
si la condicin se cumple
cuando la condicin
es falsa.
2/12
TBSecuencial (n)= TAsig(1) + TBucle(2) + TSi(5) Para calcularlo lo haremos por partes:
TAsig(1) = 1
TSi(5) =
y por tanto,
Su caso mejor se da cuando el elemento est en la primera posicin del vector O(n).
El caso medio ocurre cuando consideramos equiprobables cada una de las posiciones en las
que puede encontrarse el elemento dentro del vector (incluyendo la posicin especial -1, que
indica que el elemento a buscar no se encuentra en el vector) pero ambos son de O(n).
3/12
1)
2)
3)
5)
6)
2,2,1
4)
el
nmero
de operaciones
n OE
1,2,1
primero
2
4
3
2,1,1
1,2,1
}
El tiempo del algoritmo ser el de ejecucin de la nica instruccin que tiene, el bucle para i:
TBurbuja (n)= TBi (n). Para calcularlo lo haremos por partes:
4/12
5/12
Para obtener el tiempo emprico de una ejecucin de un algoritmo lo que vamos a hacer es
calcular el tiempo de CPU. El tiempo que toma una funcin es muy simple:
1. tomamos el valor del reloj antes de realizar la llamada (t_ini),
2. llamamos a la rutina en cuestin, y
3. tomamos nuevamente el valor del reloj (t_fin).
Ahora hay algunos pequeos detalles de implementacin. Por ejemplo, qu funcin usar para tomar el
tiempo del reloj? Y ms importante, qu precisin obtenemos con dicha funcin?.
Para tomar el tiempo podemos usar la rutina clock(), que devuelve el tiempo aproximado de CPU que
transcurri desde que nuestro programa fue iniciado, dicho tiempo representado en un valor de tipo
clock_t: un valor entero que indica una cantidad de "tics" de reloj.
La precisin que tenemos con dicha rutina es de CLOCKS_PER_SEC (tics de reloj por segundo), lo que
significa que por cada segundo que pasa, la funcin clock() nos devolver CLOCKS_PER_SEC
unidades ms que el valor anterior. Segn la plataforma utilizada dicho valor CLOCKS_PER_SEC vara
entre 1000 a 1000000.
Una vez dicho esto, el cdigo de arriba en la mayora de los casos no funciona. As que tenemos que
buscar una funcin con mayor precisin, y adems, promediar varias muestras.
Esta alternativa en Windows no sirve y la razn es sencilla, en la misma MSDN explican que el
temporizador del sistema corre aproximadamente a unos 10 milisegundos, por lo tanto, cualquier
funcin que lo utilice nos estar dando la misma poca precisin (incluso al utilizar
GetSystemTimeAsFileTime y FILETIME). Por lo tanto la solucin es utilizar lo que se conoce en el
mundo de Windows como el "contador de rendimiento de alta resolucin" (high-resolution
performance counter: que tendremos que utilizar as:
6/12
#ifndef _LIB_MTIME
#define _LIB_MTIME
#include <stdio.h>
#include <windows.h>
/* retorna "a - b" en segundos */
double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b)
{
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
}
#endif
/* Uso
int main(int argc, char *argv[])
{
LARGE_INTEGER t_ini, t_fin;
double secs;
QueryPerformanceCounter(&t_ini);
/* ...hacer algo... */
/*
QueryPerformanceCounter(&t_fin);
secs = performancecounter_diff(&t_fin, &t_ini);
printf("%.16g milliseconds\n", secs * 1000.0);
return 0;
}
*/
7/12
100
200
300
400
500
600
700
800
900
8/12
9/12
El Men consta de 3 opciones incluida la opcin de salir. El programa no finalizar hasta que la opcin
salir sea seleccionada.
Opcin 1: Esta opcin abrir un submen que efectuar el clculo de los tiempos para el algoritmo
Bsqueda secuencial.
Opcin 2: Esta opcin abrir un submen efectuar el clculo de los tiempos para el algoritmo
Burbuja.
Opcin 3: Esta opcin hace que el programa termine.
Los submens correspondientes son los siguientes:
10/12
4.4. Conclusiones.
Para cada algoritmo habr que realizar una grfica para cada una de las tres curvas obtenidas y del
orden de complejidad y comentarlas tal y como se mostr anteriormente. Son coherentes con el
resultado terico obtenido? Justificar la respuesta.
Para mostrar los datos en grfica pondremos en el eje X (abscisa) el tamao de los casos y en el eje Y
(ordenada) el tiempo, medido en milisegundos(o microsegundos), requerido por la implementacin del
algoritmo.
Esto formar parte de la memoria de la prctica.
5.
Entrega de la prctica
11/12
6.
La clase ConjuntoInt permite crear vectores de tamao variable, para cada uno es tamao fijo pues no
hacemos inserciones ya que generamos el vector de forma aleatoria para ese tamao.
Para generar los vectores con los diferentes tamaos podis utilizar el siguiente esquema:
for (int i= 100; i<1000; i+=100) // para vectores de 100 a 900 elementos
{
ConjuntoInt *c= new ConjuntoInt(i); /* crea un nuevo objeto usando el constructor
por defecto. i= numero de elementos del vector, Tamao.*/
...
...
};
Para la invocacin de un mtodo sobre el objeto dinmico se utiliza el operador flecha '->':
a->b equivale a (*a).b
Ejemplo:
12/12