// TestFibonacci.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <vector>
#include <queue>
using namespace std;
#include <math.h>
//公式实现
int Fib6(int n)
{
double gh5=sqrt((double)5);
return (int)((pow((1+gh5),n)-pow((1-gh5),n))/(pow((double)2,n)*gh5));
}
//迭代实现
int Fib5(int index)
{
if(index<1)
{
return-1;
}
int a1=1,a2=1,a3=1;
index=index-2;
for(int i=0;i<index;i++)
{
a3=a1+a2;
a1=a2;
a2=a3;
}
return a3;
}
//队列实现
int Fib4(int index)
{
if(index<1)
{
return-1;
}
queue<int> a;
a.push(1);
a.push(1);
for(int i=2;i<index;i++)
{
a.push(a.front()+a.back());
a.pop();
}
return a.back();
}
//vector实现
int Fib3(int index)
{
if(index<1)
{
return-1;
}
// Create a vector a with 2 elements of value 1
vector<int> a(2,1);
a.reserve(3);
for(int i=2;i<index;i++)
{
a.insert(a.begin(),a.at(0)+a.at(1));
a.pop_back();
}
return a.at(0);
}
//数组实现
int a[1000];
int Fib2(int index)
{
if(index<1)
{
return-1;
}
if(index<3)
{
return 1;
}
a[0]=a[1]=1;
for(int i=2;i<index;i++)
{
a[i]=a[i-1]+a[i-2];
}
int res=a[index-1];
//delete a;//释放内存(一个new对应一个delete)
return res;
}
//递归实现
int Fib1(int index)
{
if(index<1)
{
return-1;
}
if(index==1|| index==2)
{
return 1;
}
return Fib1(index-1)+Fib1(index-2);
}
int repeats = 10000000;
int fibIdx = 40;
int tickSt;
double val=0;
int _tmain(int argc, _TCHAR* argv[])
{
// printf("递归实现:\n");
//
// int tickSt = GetTickCount();
// for(int i=0;i<repeats;i++){
// printf("%d,",i);
// Fib1(fibIdx);
// }
// printf("\ncost: %d\n",GetTickCount()-tickSt);
printf("迭代实现1:\n");
tickSt = GetTickCount();
for(int i=0;i<repeats;i++){
val=Fib5(fibIdx);
}
printf("%.lf,cost: %d\n",val,GetTickCount()-tickSt);
printf("数组实现:\n");
tickSt = GetTickCount();
for(int i=0;i<repeats;i++){
val=Fib2(fibIdx);
}
printf("%.lf,cost: %d\n",val,GetTickCount()-tickSt);
printf("vector实现:\n");
tickSt = GetTickCount();
for(int i=0;i<repeats;i++){
val=Fib3(fibIdx);
}
printf("%.lf,cost: %d\n",val,GetTickCount()-tickSt);
printf("queue实现:\n");
tickSt = GetTickCount();
for(int i=0;i<repeats;i++){
val=Fib4(fibIdx);
}
printf("%.lf,cost: %d\n",val,GetTickCount()-tickSt);
printf("公式实现:\n");
tickSt = GetTickCount();
for(int i=0;i<repeats;i++){
val=Fib6(fibIdx);
}
printf("%.lf,cost: %d\n",val,GetTickCount()-tickSt);
return 0;
}
结论:
时间复杂度 | 空间复杂度 | 执行速度 | 缺点 | |
迭代实现 | O(n) | O(1) | 第一 | |
公式实现 | O(1) | O(1) | 第一 | 结果不精确 |
数组实现 | O(n) | O(n) | 第二 | |
queue实现 | O(n) | O(1) | 第三 | |
vector实现 | O(n) | O(1) | 第四 | |
递归实现 | 最慢 |