算法学习 | 从几个有趣的故事说起,聊聊里面的算法

简介: 今天分享读了的故事、研究了的解题过程以及总结的一些算法知识点和经验。

前言

提到故事我就来劲头了。一方面,我喜欢读故事、讲故事、搜集故事,另一方面,用讲故事的方式会为学习增加一些趣味性,有兴趣可以帮助坚持下去。

下面要介绍的故事,有些大家应该不陌生。我之前有读到过,但是没有认真的研究过,有种熟悉的陌生感。

今天分享读了的故事、研究了的解题过程、顺便总结的一些算法知识点和经验。

故事来咯

棋与麦子

故事内容

传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要您的重赏 ,陛下,只要您在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。国王觉得几粒麦子,这要求很简单,满口答应着,令人如数付给西塔。

摆放麦子的工作开始了,没多久一袋麦子就空了。一袋又一袋的麦子被扛到国王面前来。但是,麦粒数一格接一格飞快增长着,国王很快就看出来,即便拿出全国的粮食,也兑现不了他对西塔的诺言。

所以64个格子到底能放多少粒麦子呢?

解题过程

假设总和是S,那么计算表达式是这样的:

        ①

将等式①等式左右两侧同时乘以2,等式依旧成立:

       ②

好,现在将两个等会进行相减,会得到下面的等式:

我用计算机算了一下S最终的值是18446744073709551615。

这么多粒麦子多重呢?百度中查到的小麦为0.023-0.058克左右,取个平均数吧,0.041克。

18446744073709551615✖️0.041 = 75631650702209152(克)

转换一下单位

≈ 7563 (亿吨)

这个数据相当可观,对比感受一下它大到什么程度。

据国家公布的数据,我们已经连续5年时间小麦年产量达到1.3亿吨。

书中提到这种函数被称为爆炸增量函数。时间复杂度是O()。想想,随着n的值不断增加,这个算法会怎么样?比如购物网站的下单系统,使用人数不断增加,页面可能会出现白屏、无法完成支付等问题。

O()也就是指数时间复杂度的运行效率极差,这样是算法要谨慎使用。

在设计算法的时候,一定要注意算法复杂度增量的问题,尽可能避免使用爆炸增量函数。

兔子数列

故事内容

一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死:

第一个月小兔子没有繁殖能力,所以还是一对;

两个月后,生下一对小兔对数共有两对;

三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;

......

那么12个月之后会有多少兔子呢?

解题过程

首先,先研究一下兔子出生和成熟规律,这个规律借助表格更加直观:

月数

0

1

2

3

4

5

6

7

8

9

10

11

成兔对数

0

1

1

2

3

5

8

13

21

34

55

89

初生对数

1

0

1

1

2

3

5

8

13

21

34

55

总对数

1

1

2

3

5

8

13

21

34

55

89

144

从第二个月开始,就有规律了,每过一个月,初生兔子变成熟,成熟兔子生出一对兔子,就有这样的等式:

  • 初生对数=前一月的成兔对数
  • 成兔对数=前一月的成兔对数+前一月的初生对数
  • 总体对数=本月的成兔对数+本月的初生对数

这么有趣的规律,数学家就开始整活了,数学家莱昂纳多·斐波那契以兔子繁殖为例子引入了菲波那切数列,又称为“兔子数列”。

菲波那切数列如下:

1、1、2、3、5、8、13、21、34、55、89……

递归表达式:

重点来了,这个算法如何设计?

functionfibFunc(n) {
if (n<1) {
return1;
  }
if (n===1||n===2) {
return1;
  }
letf1=1;
letf2=1;
for (leti=3; i<=n; i++) {
f2=f2+f1; // 辗转相加法f1=f2-f1; // 记录前一项  }
returnf2;
}
console.log(fibFunc(1)); // 1console.log(fibFunc(2)); // 1console.log(fibFunc(3)); // 2console.log(fibFunc(11)); // 89

该算法的复杂性为:

空间复杂度:O(n)

时间复杂度:O(1)

未完待续

果然故事有趣,学起来也轻松不少。

还有一个更有趣的故事,叫做自然界里关于斐波那契的巧合。精炼一下这个故事就是

树木抽长新枝条的规律、一些花的花瓣数量,都符合斐波那契数列。而这种自然现象,是因为这些植物按照自然的规律才进化成这样。似乎是植物排列种子的“优化方式”,便于更好的生存和生长。

我有种不但逐渐熟悉了算法,还学习了自然相关的新知识的双重收获的快乐感觉。

老实说,除了故事本身,逐渐找到规律、研究规律,并找到对应的算法,真是一件非常愉快的事。

对算法的学习,逐渐上头。

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