Algoritmos: Grado en Ingeniería Informática
Algoritmos: Grado en Ingeniería Informática
Septiembre de 2014
Prctica 1
Fecha lmite de entrega: lunes, 29 de septiembre
La sucesin de Fibonacci se define inductivamente del modo siguiente:
fib(n)=
0
1
fib(n-1)+fib(n-2)
si n=0;
si n=1;
si n>=2.
En el caso del primero algoritmo, O(n ) con = 1+2 5 , use la funcin f (n) = 1,1n para la cota
subestimada, y f (n) = 2n para la sobreestimada.
En el segundo algoritmo O(n) se proponen f (n) = n0,8 y f (n) = n log(n) como cotas subestimada y sobreestimada.
p
Y en el tercero O(log n), use f (n) = ( log(n)) para la cota subestimada, y f (n) = n0,5 para la
sobreestimada.
5. Deposite, desde alguna de las mquinas de referencia, en /PRACTICAS/GEI/Alg/P1/ (existe un
directorio para cada estudiante) los ficheros C y el informe con el estudio emprico de la complejidad.
Consulte las mquinas de referencia disponible en la pgina wiki.fic.udc.es.
#include <sys/time.h>
#include <stdio.h>
/* obtiene la hora actual en microsegundos */
double microsegundos() {
struct timeval t;
if (gettimeofday(&t, NULL) < 0 )
return 0.0;
return (t.tv_usec + t.tv_sec * 1000000.0);
}
#include <stdio.h>
#include <math.h>
int fib3(int n) {
int i, j, k, h, t;
i = 1; j = 0; k = 0; h = 1;
while ( n > 0 ) {
if ((n % 2) != 0) {
t = j * h;
j = (i * h) + (j * k) + t;
i = (i * k) + t;
}
t = h * h;
h = (2 * k * h) + t;
k = (k * k) + t;
n = n / 2;
}
return j;
}
int main() {
int n;
double t1, t2, t, x, y, z;
n=1000000;
t1 = microsegundos();
fib3(n);
t2 = microsegundos();
t = t2-t1;
x = t / sqrt(log(n));
y = t / log(n);
z = t / pow(n, 0.5);
printf("%12d%15.3f%15.6f%15.6f%15.6f\n", n, t, x, y, z);
}