测试斐波那契–使用不同的算法 以及 对于输入的输出 用时
以下两段代码,只是注释和解除注释展示两个算法。
1.直接递归
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
int f = 1, r = 0, t;
//直接递归解,n=38 超时
int ff(int n) {
if (n == 1 || n == 2) return 1;
return ff(n - 1) + ff(n - 2);
}
int fib(int n) {
clock_t start, finish;
double duration;
start = clock();
//这一段代码是优化的算法
// if(n==0) return 0;
// int i=3;
// while(i<=n){
// t=(f+r)%1000000007;
// f=r;
// r=t;
// i++;
// }
//ff函数是纯递归
r = ff(n);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("%f seconds\n", duration);
return r;
}
int main(void)
{
int n;
while (1) {
cin >> n;
fib(n);
}
system("pause");
}
结果:
可以看到,n=37直逼1s ,n=38时候已经超过1s, n=100的时候根本跑不出来(等了至少5分钟,等出来也没意义)。
下面是leetcode:
n=42,勉强能过,43已经过不了,100也理所当然的超出了时间限制
2.记忆化搜索+空间的优化
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
int f = 1, r = 1, t;
//直接递归解,n=38 超时
int ff(int n) {
if (n == 1 || n == 2) return 1;
return ff(n - 1) + ff(n - 2);
}
int fib(int n) {
clock_t start, finish;
double duration;
start = clock();
//这一段代码是优化的算法
if(n==0) return 0;
int i=3;
while(i<=n){
t=(f+r)%1000000007;
f=r;
r=t;
i++;
}
//ff函数是纯递归
//r = ff(n);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("%f seconds\n", duration);
return r;
}
int main(void)
{
int n;
while (1) {
cin >> n;
fib(n);
}
system("pause");
}
结果:
通过和上面的递归算法相比,可以看出来同为n=43时,这个算法执行的时间明显的比递归算法的快,而且不止一点点。
当然n=100的时候也是非常快,说明这个算法比递归算法更优。
最后是leetcode的AC代码:
class Solution {
public:
int f=1,r=1,t;
int ff(int n){
if(n==1 || n==2) return 1;
return ff(n-1)+ff(n-2);
}
int fib(int n) {
clock_t start, finish;
double duration;
start = clock();
if(n==0) return 0;
int i=3;
while(i<=n){
t=(f+r)%1000000007;
f=r;
r=t;
i++;
}
// r=ff(n);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("%f seconds\n", duration);
return r;
}
};