使用斐波那契数列来分析动态规划算法

对于动态规划,可以将其理解为把一个原始的问题分解成为很多歌规模相对较小的子问题,对于每一个子问题之间是存在一定的联系的,而通过对各个子问题的求解,并将这些求解组合起来就可以得到原始问题的解。

这里主要是通过使用斐波那契数列的求解来对动态规划算法的几要素进行分析。

对于斐波那契函数的算法主要提供两种算法,一种是递归算法,另外一种是动态规划算法。

首先是对于动态规划算法的四个要素进行一个说明,动态规划算法用于解决的原始问题有四个基本元素,分别是最优子结构、重叠子问题、状态与状态转移方程以及边界条件。一个问题具有最优子结构即该问题的最优解必然会包含它的子问题的最优解,举个例子就是如果爬楼,我们想要知道有什么方式可以爬到顶楼,而我们知道了可以用什么方式爬次顶楼,还有次顶楼的下一楼的方式爬上去之后,我们就可以知道有那些方法区爬顶楼,这也就是对于爬顶楼的子问题,就是如何去爬次顶楼。

第二个元素就是重叠子问题。对于具有子结构的问题会让人想到把各个子问题相互独立,所以会考虑递归算法,但是对于递归算法的运行过程中,会存在很多的重复性的计算,这也就导致了效率的降低,所以在使用动态规划算法时,对于要解决的原始问题中,已经解决了子问题的结果是可以直接取用的,无需再次去计算。

第三个元素是动态规划算法的核心,就是状态与状态转移方程,对于状态即是原始问题的子问题的解,而状态转移方程就是找到子问题之间的递推关系,有了递推关系和子问题的解,就可以从最底部开始,一直往上解决子问题,直至解决了原始问题。通过这个元素就可以实现只解决一次各个子问题,就可以一次性的获得原始问题解。

最后一个就是边界条件。对于边界条件也即是运行程序的终止条件,这个条件也就是原始问题的规模参数,当达到了这个边界条件时就可以停止并得到原始问题的解。

以下是以递归算法求斐波那契数列:

def fib1(n):
    print('fib(',n,")")
    if n<1:
        return 0
    if n<3:
        return 1
    return fib1(n-1)+fib1(n-2)

添加图片注释,不超过 140 字(可选)

以下是动态规划算法求斐波那契数列:

def fib2(n):
    l = [0,1,1]
    for i in range(3,n+1):
        l.append(l[i-1]+l[i-2])
    return l[n]

print(fib2(5))

添加图片注释,不超过 140 字(可选)

对于使用递归算法求解时随着求解的值逐渐增大递归中出现了大量的重复计算,这也导致了时间复杂度急剧变大运行的效率会逐渐降低,其时间复杂度为O(n^2)。

而使用动态规划算法的时间复杂度仅为O(n)。但是想对的动态规划算法需要额外的内存空间,空间复杂度会相对较高,因此动态规划算法是使用空间复杂度高来换取低时间复杂度的算法。

相关推荐
一只码代码的章鱼42 分钟前
粒子群算法 笔记 数学建模
笔记·算法·数学建模·逻辑回归
小小小小关同学42 分钟前
【JVM】垃圾收集器详解
java·jvm·算法
圆圆滚滚小企鹅。1 小时前
刷题笔记 贪心算法-1 贪心算法理论基础
笔记·算法·leetcode·贪心算法
Kacey Huang1 小时前
YOLOv1、YOLOv2、YOLOv3目标检测算法原理与实战第十三天|YOLOv3实战、安装Typora
人工智能·算法·yolo·目标检测·计算机视觉
eguid_11 小时前
JavaScript图像处理,常用图像边缘检测算法简单介绍说明
javascript·图像处理·算法·计算机视觉
带多刺的玫瑰2 小时前
Leecode刷题C语言之收集所有金币可获得的最大积分
算法·深度优先
LabVIEW开发2 小时前
PID控制的优势与LabVIEW应用
算法·labview
涅槃寂雨2 小时前
C语言小任务——寻找水仙花数
c语言·数据结构·算法
就爱学编程2 小时前
从C语言看数据结构和算法:复杂度决定性能
c语言·数据结构·算法
刀客1232 小时前
数据结构与算法再探(六)动态规划
算法·动态规划