测试斐波那契--使用不同的算法 以及 对于输入的输出 用时

测试斐波那契–使用不同的算法 以及 对于输入的输出 用时

以下两段代码,只是注释和解除注释展示两个算法。

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;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值