初学算法——第二天:斐波那契数列

news/2024/7/23 20:30:04 标签: 算法

14天阅读挑战赛

1 定义

斐波那契数列的定义者,是意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的莱昂纳多”。1202年,他撰写了《算盘全书》(Liber Abacci)一书。

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89…
这个数列从第3项开始,每一项都等于前两项之和

递归表达式如下:
在这里插入图片描述

2 算法设计

1.递归算法

int Fib1(int n){
    if(n==1||n==2)   
    return 1;
    return Fib1(n-1)+Fib1(n-2);
}

算法的时间复杂度计算:
假设T(n)表示Fib1(n)所需的基本操作次数,那么:

n=1时,T(n)=1;
n=2时,T(n)=1;
n=3时,T(n)=3//调用Fib1(2)和Fib1(1)并执行一次加法运算(Fib1(2)+Fib1(1))
即:
n>2时,T(n)=T(n-1)+T(n-2)+1

在这里插入图片描述斐波那契数列的通项公式:
在这里插入图片描述由于T(n)>=F(n),因此这是一个指数阶的算法算法的时间复杂度属于爆炸增量函数。
2.算法改进:采用迭代法进行算法设计

int Fib3(int n){
    if(n==1||n==2)   
         return 1;
    int s1=1; //用s1和s2记录前面的两项
    int s2=1;
    for(int i=3;i<=n;i++){
         int tmp=s1+s2;
         s1=s2;
         s2=tmp;
    }
    return s2;
}

此时时间复杂度为O(n),空间复杂度为O(1)。
实质上,斐波那契数列的时间复杂度还可以降到对数阶,本文不做过多讲解。

2 什么是爆炸级增量

在上篇文章中讲到,在设计算法时,我们要注意算法复杂度增量的问题,尽量避免爆炸级增量。那么什么样的是爆炸级增量呢?
一个小故事:《一棋盘的麦子》
有一个古老的传说,一位国王的女儿不幸落水,水中有很多鳄鱼,国王情急之下下令:“谁能把公主救上来,就把女儿嫁给他。”很多人纷纷退让,一个勇敢的小伙子挺身而出,冒着生命危险把公主救了上来,国王一看是个穷小子,想要反悔,说:“除了女儿,你要什么都可以。”小伙子说:“好吧,我只要一棋盘的麦子。您在第1个格子里放1粒麦子,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,以此类推,每一个格子里麦子的粒数都是前一格子里麦子粒数的两倍。把这64个格子放满了就行,我就要这么多。”国王听后哈哈大笑,觉得小伙子的要求很容易满足,满口答应。结果发现,把全国的麦子都拿来,也填不完这64个格子………国王无奈,只好把女儿嫁给了这个小伙子。
解析:通过这个故事,算出64格可放的麦子,总和为S
S=1+2一次方+2的二次方+2的三次方…+2的63次方①
对式①等号的两边乘以2,等式仍然成立
2S=2的一次方+2的二次方+2的三次方+…+2的64次方
用式②减去①得
S=2的64次方-1= 18 446 744 073 709 551615
总重量约为7729000(亿千克)

我们称这样的函数为爆炸增量函数

如果算法的时间复杂度是O(2^n),随着n的增长,算法就会“爆掉”。例如:我们经常见到有些算法调试没问题,运行一段时间也没问题,但在关键的时候宕机(shutdown)。例如在线考试系统,50人考试没问题,100人考试也没问题,但如果全校10 000人考试就可能宕机。


http://www.niftyadmin.cn/n/312.html

相关文章

你只管生产,其他的请交给华为云大数据BI解决方案

你只管生产&#xff0c;其他的请交给华为云大数据BI解决方案 制造业已经占据了我国经济指标的主体地位&#xff0c;对经济增长产生着重要影响。随着世界经济一体化进程不断加快和全球产业链分工逐渐深化&#xff0c;"中国制造2025"将成为推动我国实现产业升级发展的…

应用层——HTTP协议

文章目录一、应用层1.1 应用层概念1.2 再谈协议二、网络版本的计算器网络计算器编码部分版本1&#xff1a;原生版本版本2&#xff1a;引入序列化和反序列化三、HTTP协议3.1 URL3.2 urlencode和urldecode3.3 HTTP协议格式3.3.1 请求报文3.3.2 响应报文3.4 HTTPDemo3.4.1改进3.4.…

Redis实战 - 11 Redis GEO 实现附近的人功能

各种社交软件里面都有附件的人的需求&#xff0c;在该应用中&#xff0c;我们查询附近1公里的食客&#xff0c;同时只需查询出20个即可。 文章目录1. Redis GEO常用命令2. 上传用户地理位置1. RedisKeyConstant2. 控制层 NearMeController3. 业务层 NearMeService4. 项目测试5.…

golang的defer的理解- defer的函数一定会执行吗?

文章目录golang的defer什么是defer理解deferdefer什么时间执行&#xff08;defer、 return、返回值 三者的执行顺序&#xff09;defer输出的值&#xff0c;就是定义时的值。而不是defer真正执行时的变量值&#xff08;注意引用情况&#xff09;多个defer&#xff0c;执行顺序de…

毕业设计 基于51单片机无线蓝牙APP控LED灯亮灭亮度设计

基于51单片机无线蓝牙APP控LED灯亮灭亮度设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 LED信号指示灯电路设计2.2 蓝牙模块3、部分代码展示3.1 串口初始化3.1 定时器初始化1、项目简介 选题指导&#xff0c;项目分享: https://gitee.com/lighter-z/embedded-ba…

【从零开始游戏开发】EmmyLua插件注解功能

你知道的越多&#xff0c;你不知道的越多 &#x1f1e8;&#x1f1f3;&#x1f1e8;&#x1f1f3;&#x1f1e8;&#x1f1f3; 点赞再看&#xff0c;养成习惯&#xff0c;别忘了一键三连哦 &#x1f44d;&#x1f44d;&#x1f44d; 文章持续更新中 &#x1f4dd;&#x1f4dd;…

【1024 | 程序员节】浅谈前端开发中常用的设计模式——适配器模式、工厂模式、单例模式等

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录设计模式设计模式分类工厂模式什么是工厂模式工厂模式好处单例模式…

【 C++11 】lambda表达式

目录 1、lambda表达式的引入 2、lambda表达式 lambda表达式的语法 lambda表达式捕捉列表说明 使用lambda表达式排序自定义类型 lambda表达式的底层原理 1、lambda表达式的引入 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法&…