算法学习 【第一周】Ⅱ

简介: 学习有关算法设计和改进的知识。

一、前言

在上一期博客中我们学习了有关算法复杂性的知识,本期博客我们将通过两个例子去学习一下算法的设计和改进知识。

有些时候解决一个问题,并不是所有的算法都可以,我们需要分析问题对比各种算法然后选择最优算法,在很多编程比赛中就对此有明确的要求,选手需要使用最优算法,尽量把算法复杂性降到最低。

废话不多说,我们开始今天的学习!

二、一棋盘的麦子

这个故事相比大家并不陌生,在高中学习数学的时候老师可能提到过。

故事大致是,传说有个勇敢的小伙子救了国王女儿,然后国王答应将女儿嫁给他,但发现他是一个穷小子,便反悔说除了女儿其他的要求随便提,然后小伙子就说他只需要一棋盘的麦子,在第一个格子里面放1粒麦子,第2个格子里面放2粒麦子,在第3个格子里面放4粒麦子,依次类推,每个格子里面的麦子的粒数都是前一格的两倍,放满64格就行,国王觉得很简单,但最后发现把全国的麦子都拿出来也填不满64个格子,最后只好将女儿嫁给了这个小伙子。

这个故事体现了指数爆炸的情况,我们将其解析成数学问题就是:

棋盘上的64个格子究竟需要放多少粒麦子?

分析可知:S=1+21+22+23+…+263

等号两边乘以2,然后再用乘以2的式子减去原始式子得:

S=264-1=18446744073709551615

上网查资料可知,每粒麦子平均重量约41.9毫克,那么总共大概7729000亿千克,这个数字非常夸张。

这样的函数也被称为爆炸增量函数,如果算法的时间复杂度也是这种爆炸增量函数,那么随着未知数的增加,程序就会宕机,无法正常工作,这是我们在选择算法时必须要注意的问题。

常见的算法时间复杂度有以下几类:

  1. 常数阶
    也就是算法运算次数是一个常数,其时间复杂度就是O(1)。
  2. 多项式阶
    很多算法的时间复杂度都是多项式阶,但我们一般表示时间复杂度时只看多项式的最高项,所以一般时间复杂度就是O(n)、O(n2)、O(n3)等。
  3. 指数阶
    绝大部分指数阶的算法运行效率极差,我们在选择算法时就需要避免出现指数阶的时间复杂度,比如O(2n)、O(n!)、O(nn)等。
  4. 对数阶
    对数阶的算法运行效率比较高,比如O(logn)、O(nlogn)等。

我们在设计算法时也需要注意算法复杂度增量问题,避免出现爆炸级增量。

三、神奇的兔子数列

这个例子也是一个经典的数学题目。

假设第1个月有1对初生的兔子,第2个月进入成熟期,第3个月开始生育兔子,而1对成熟的兔子每月会生1对兔子,兔子永不死去,那么,由1对初生兔子开始,12个月之后会有多少对兔子。

这个问题也就是求解斐波那契数列。

我们不难发现,这个兔子数列有一个很明显的特点,那就是从第三个月开始,当月兔子数=上月兔子数+当月新生兔子数,而当月新生兔子数正好又等于上上月的兔子数,也就是当月兔子数=上月兔子数+上上月兔子数。

抽象成递归表达式就是:

image-20221020170358082.png

如果我们要针对这个问题设计一个算法的话,那肯定选择递归算法。

intFib1(intn){
if(n==1||n==2)
return1;
returnFib1(n-1)+Fib1(n-2);
}

当我们写出一个算法之后,我们就需要考虑它的复杂度了,看看它属于哪种算法。

我们分析出该算法的时间复杂度和表达式的关系可以写成:

image-20221020171338142.png

我们求出斐波那契数列的通项公式:

image-20221020171440331.png

由于T(n)>=F(n),所以我们的这个算法是一个指数阶算法,也就是我们常说的暴力递归方法。

指数阶算法是我们需要避免的,所以接下来我们将考虑一下如果将算法进行改进优化,让其复杂度降低。

除了开头两项之外,我们可以发现斐波那契数列中的每一项都是前两项之和,如果记录前两项的值,则只需要一次加法运算就可以得到当前项的值。

intFib2(intn){
int*F=newint[n+1];    //定义一个长度为n+1的数组// 数组前两项,n=1和n=2F[1]=1;
F[2]=1;
// n>2for(inti=3;i<=n;i++)
F[i]=F[i-1]+F[i-2];
returnF[n];
}

上述算法的时间复杂度很明显就是O(n),而且我们将时间复杂度从指数阶降到了多项式阶,效率得到了大大提高。

在上述算法中我们使用了一个辅助数组记录中间结果,其实我们只需要得到第n个斐波那契数,中间结果只是为了下一次使用,根本就不需要记录,所以我们还可以将算法进行优化改进一下,采用迭代法进行改进。

intFib3(intn){
if(n==1||n==2)
return1;
ints1=1;
ints2=1;
for(inti=3;i<=n;i++){
inttmp=s1+s2;
s1=s2;
s2=tmp;
    }
returns2;
}

在这个算法中哦我们使用了几个辅助变量进行迭代,时间复杂度为O(n),但空间复杂度从之前的O(n)降到了现在的O(1)。

斐波那契数列的时间复杂度还可以通过矩阵乘法降低到对数阶,这个我没有看懂所以在这里也不敢介绍,感兴趣的朋友可以去网上查阅一下,还是比较复杂的,但可以从中学到很多。

四、最后我想说

斐波那契数列的算法设计也是一道经典的编程题目,在很多的刷题网站上面都有,有各种各样的解法,大家可以去看看。

我们学习算法要学习数据结构和算法策略,这两个方向时相互独立的,对于同一个数据对象上不同的问题,就会用到不同的算法策略,一般来说我们在大学里面本科阶段也就学习了数据结构,有关算法策略涉及的很少,所以后面我会继续学习这本书然后更新有关算法策略的知识,谢谢支持!

目录
相关文章
|
3月前
|
存储 算法
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
这篇文章详细介绍了图的概念、表示方式以及深度优先遍历和广度优先遍历的算法实现。
77 1
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
|
5天前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
59 11
架构学习:7种负载均衡算法策略
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
138 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
144 2
动态规划算法学习三:0-1背包问题
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法

热门文章

最新文章