Fibbonacci com Memoization - O(n)
Visto que rolou uma brincadeira de otimização do código que encontra um número de fibonacci aqui (http://www.vivaolinux.com.br/script/Sequencia-fibonacci-com-35-linhas-e-for), resolvi mostrar uma técnica legal para se ter um desempenho muito superior.
A brincadeira do pessoal era em relação ao menor número de linhas. Porém, o que quero mostrar aqui é o desempenho de execução.
Vejam a diferença:
Código cedido pelo thiagodorneles com algumas modificações:
#include<stdio.h>
long int fibo(int n)
{
return ((n<2)?1:(fibo(n-2)+fibo(n-1)));
}
int main(int argc, char **argv)
{
int v = atoi(argv[1], 10);
long int r = 0;
r = fibo(v);
printf("Resultado fibonacci: %ld\n",r);
}
Comparação de tempo de execução entre o meu código e o do Thiago:
dang@server:~/fibo$ time ./fibo_daniel 40
Fibonacci[40] = 165580141
real 0m0.025s
user 0m0.000s
sys 0m0.024s
dang@server:~/fibo$ time ./fibo_thiago 40
Resultado fibonacci: 165580141
real 0m5.548s
user 0m5.380s
sys 0m0.028s
Quem quiser fazer o teste, fique a vontade.
A idéia da técnica de memorization é guardar os valores já calculados para evitar recálculo. Este é uma das bases da programação dinâmica. ;)
Bom estudo a todos,
Daniel
A brincadeira do pessoal era em relação ao menor número de linhas. Porém, o que quero mostrar aqui é o desempenho de execução.
Vejam a diferença:
Código cedido pelo thiagodorneles com algumas modificações:
#include<stdio.h>
long int fibo(int n)
{
return ((n<2)?1:(fibo(n-2)+fibo(n-1)));
}
int main(int argc, char **argv)
{
int v = atoi(argv[1], 10);
long int r = 0;
r = fibo(v);
printf("Resultado fibonacci: %ld\n",r);
}
Comparação de tempo de execução entre o meu código e o do Thiago:
dang@server:~/fibo$ time ./fibo_daniel 40
Fibonacci[40] = 165580141
real 0m0.025s
user 0m0.000s
sys 0m0.024s
dang@server:~/fibo$ time ./fibo_thiago 40
Resultado fibonacci: 165580141
real 0m5.548s
user 0m5.380s
sys 0m0.028s
Quem quiser fazer o teste, fique a vontade.
A idéia da técnica de memorization é guardar os valores já calculados para evitar recálculo. Este é uma das bases da programação dinâmica. ;)
Bom estudo a todos,
Daniel
Descrição
Visto que rolou uma brincadeira de otimização do código que encontra um número de fibonacci aqui (http://www.vivaolinux.com.br/script/Sequencia-fibonacci-com-35-linhas-e-for), resolvi mostrar uma técnica legal para se ter um desempenho muito superior.
A brincadeira do pessoal era em relação ao menor número de linhas. Porém, o que quero mostrar aqui é o desempenho de execução.
Vejam a diferença:
Código cedido pelo thiagodorneles com algumas modificações:
#include<stdio.h>
long int fibo(int n)
{
return ((n<2)?1:(fibo(n-2)+fibo(n-1)));
}
int main(int argc, char **argv)
{
int v = atoi(argv[1], 10);
long int r = 0;
r = fibo(v);
printf("Resultado fibonacci: %ld\n",r);
}
Comparação de tempo de execução entre o meu código e o do Thiago:
dang@server:~/fibo$ time ./fibo_daniel 40
Fibonacci[40] = 165580141
real 0m0.025s
user 0m0.000s
sys 0m0.024s
dang@server:~/fibo$ time ./fibo_thiago 40
Resultado fibonacci: 165580141
real 0m5.548s
user 0m5.380s
sys 0m0.028s
Quem quiser fazer o teste, fique a vontade.
A idéia da técnica de memorization é guardar os valores já calculados para evitar recálculo. Este é uma das bases da programação dinâmica. ;)
Bom estudo a todos,
Daniel
A brincadeira do pessoal era em relação ao menor número de linhas. Porém, o que quero mostrar aqui é o desempenho de execução.
Vejam a diferença:
Código cedido pelo thiagodorneles com algumas modificações:
#include<stdio.h>
long int fibo(int n)
{
return ((n<2)?1:(fibo(n-2)+fibo(n-1)));
}
int main(int argc, char **argv)
{
int v = atoi(argv[1], 10);
long int r = 0;
r = fibo(v);
printf("Resultado fibonacci: %ld\n",r);
}
Comparação de tempo de execução entre o meu código e o do Thiago:
dang@server:~/fibo$ time ./fibo_daniel 40
Fibonacci[40] = 165580141
real 0m0.025s
user 0m0.000s
sys 0m0.024s
dang@server:~/fibo$ time ./fibo_thiago 40
Resultado fibonacci: 165580141
real 0m5.548s
user 0m5.380s
sys 0m0.028s
Quem quiser fazer o teste, fique a vontade.
A idéia da técnica de memorization é guardar os valores já calculados para evitar recálculo. Este é uma das bases da programação dinâmica. ;)
Bom estudo a todos,
Daniel
#include <stdio.h>
#define MAX 512
int v[MAX];
int fibonacci(int n)
{
if (n < 2)
return 1;
if (v[n] != 0)
return v[n];
return v[n] = fibonacci(n-1) + fibonacci(n-2);
}
int main(int argc, char **argv)
{
int n = atoi(argv[1], 10);
memset(v, 0, sizeof(int)*n);
printf("Fibonacci[%d] = %d\n", n, fibonacci(n));
return 0;
}