初入算法(2)—— 进入算法世界

简介: 本章将会继续在初入算法(1)——进入算法世界 的基础上继续通过趣学算法进行算法的学习。

一.爆炸增量函数

1.引入故事:《一棋盘的麦子》


   有一个古老的传说,一位国王的女儿不幸落水,水中有很多鳄鱼,国王情急之下下令:“谁能把公主救上来,就把女儿嫁给他。”很多人纷纷退让,一个勇敢的小伙子挺身而出,冒着生命危险把公主救了上来,国王一看是个穷小子,想要反悔,说:“除了女儿,你要什么都可以。”小伙子说:“好吧,我只要一棋盘的麦子。您在第1个格子里放1粒麦子,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,以此类推,每一个格子里麦子的粒数都是前一格子里麦子粒数的两倍。把这64个格子放满了就行,我就要这么多。”国王听后哈哈大笑,觉得小伙子的要求很容易满足,满口答应。结果发现,把全国的麦子都拿来,也填不完这64个格子…..…国王无奈,只好把女儿嫁给了这个小伙子。


图片.png

解析:通过这个故事,算出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(亿千克)


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

2.算法中的时间复杂度


如果算法的时间复杂度是O(2n次方)

会怎样?随着n的增长,算法会不会“爆掉”?我们经常见到有些算法调试没问题,

运行一段时间也没问题,但在关键的时候宕机(shutdown)。


例如:在线考试系

统,50人考试没问题,100人考试也没问题,但如果全校10000人考试就可能宕机。


   科普:宕机就是死机,指计算机无法正常工作,包括一切原因导致的死机。计算机主机出现意外故障而死机,一些服务器(如数据库服务器)死锁,服务器的某些服务停止运行等,都可以称为宕机。


3.常见的时间复杂度类型


(1)常数阶

常数阶算法的运行次数是一个常数,如5、20、100。常数阶算法的时间复杂度通常用O(1)表示。

(2)多项式阶

很多算法的时间复杂度是多项式,通常用O(n)、O(n²)、O(n³)等表示。

(3)指数阶

指数阶算法的运行效率极差,程序员往往像躲“恶魔”一样避开这种算法。指数阶算法的时间复杂度通常用O(2ⁿ)、O(n!)、O(nⁿ)等表示。

(4)对数阶

对数阶算法的运行效率较高,通常用O(logn)、O(nlogn)等表示。

图片.png

二.兔子数列

1.什么是兔子数列


   兔子数列又称斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波那契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波那契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果

图片.png

斐波那契数列概述图


例子:


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

图片.png

当月兔子数=上月兔子数+上上月兔子数


算法设计:递归算法


   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时需要分别调用Fib1(n-1)和Fib1(n-2)并执行一次加法运算,换

言之:


n>2时,T(n)=T(n-1)+T(n-2)+1;


递归表达式和时间复杂度T(n)的关系如下:

图片.png


由此可得:图片.png


如何算出F(n)?


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

图片.png


2.递推公式


斐波那契数列:1,1,2,3,5,8,13,21,34,55,89...


   如果设an为该数列的第n项(),那么这句话可以写成如下形式:图片.png


    显然这是一个线性递推数列


   通项公式内容

图片.png

    (如上,又称为“比内公式”,是用无理数表示有理数的一个范例。)


3.尾数循环


斐波那契数列的个位数:一个60步的循环


11235,83145,94370,77415,61785,38190,


99875,27965,16730,33695,49325,72910…


进一步,斐波那契数列的最后两位数是一个300步的循环,最后三位数是一个1500步的循环,最后四位数是一个15000步的循环,最后五位数是一个150000步的循环。


本章就将学的这里,后续将会继续更新算法文章


创作不易,求关注,点赞,收藏,谢谢~

目录
相关文章
|
存储 自然语言处理 算法
初入算法(1)—— 进入算法世界
了解算法,学习算法,应用算法
143 0
初入算法(1)—— 进入算法世界
|
27天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
12天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
13天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
14天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
13天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
13天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
32 3
|
24天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
26天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。