美文网首页
七、动态规划

七、动态规划

作者: 奔向算法的喵 | 来源:发表于2019-02-20 22:12 被阅读0次

记录一下对动态规划的学习。在学习数据结构与算法的过程中,觉得比较难的一个算法思想就是动态规划了。它的应用实在是多,比如在机器学算法CRF中,就用到了动态规划。

一、斐波那契数列

下面就以斐波那契数列来说明动态规划把。我们都知道斐波那契数列的递推公式是
f(0)=0; f(1)=1 f(n)=f(n-1)+f(n-2)
这个公式在高中就可以求通项公式,不过求解的过程在当时还是有点点麻烦,而现在来说的话,我们都是采用程序来解决这个问题。
思路一:采用递归调用的方式来解决。这种方式采用起来很简单。但是当n很大的时候,时间复杂度就是指数级的增长了。
时间复杂度:O(2^n)

def fib(n):
    if n==0:
        return 0
    elif n==1:
        return 1
    else:
        return fib(n-1)+fib(n-2)
if __name__ == '__main__':
    print(fib(0))  # 0
    print(fib(1))  # 1
    print(fib(2))  # 1
    print(fib(3))  # 2
    print(fib(4))  # 3
    print(fib(5))  # 5

之所以出现了指数级的一个时间复杂度,就是因为我们在计算的过程中,进行了很多的重复计算,所以我们能够想到的就是将重复计算出的值进行一个保存,然后后面要用到的时候,就直接进行一个调用就行了。
思路二:采用自顶向下的解决方法,也就是我们常说的记忆化搜索的方式来解决这个问题
思路三:采用自底向上的方式去解决这个问题,这种方法就是我们所说的动态规划。看下面的代码,我们就根据一次的循环遍历得到时间复杂度O(n),因为是用了空间去换取时间上的优势,那么我们的空间复杂度就是O(n)。由此我们可以看出动态规划将时间复杂大大的降低了

def fib(n):
    if n==0:
        return  0
    alist = [-1] * (n+1)
    alist[0]=0
    alist[1]=1
    for i in range(2,n+1):
        alist[i] = alist[i-1]+alist[i-2]
    return alist[n]

大多数dp问题的本质都是递归问题,在递归的过程中,我们就发现了重叠的子问题(计算重复),对于重叠的子问题,我们可以采用记忆化搜索来解决,它是一种自顶向下的解决问题的手段。另外一种方式就是动态规划,它的的本质其实和记忆化搜索是一样,只不过它是自底向上的方式去解决问题。
和此思想最相关的一个LeetCode 题目就是LeetCode 70,就是将爬楼梯的问题仔细思考之后,本质还是一个斐波那契数列。

二、动态规划

这部分的总结,有不少感悟来自于知乎大神答案的总结,喜欢的话,就直接去后面的链接看看。

2.1、本质

  • 动态规划的本质:对问题的定义状态转移方程的定义
    通过定义好问题和状态转移方程,就能够很好的将问题拆分出来,从而写出递推的公式,进而解决问题。就像是解决递归问题,要找到递归终止条件(最基本的同一问题)和递归的过程条件。

2.2、递归、贪心、搜索和动态规划

算法 理解
递归
贪心
搜索
动态规划

持续更新中...
数据结构与算法系列博客:
一、数据结构与算法概述
二、数组及LeetCode典型题目分析
三、链表(Linked list)以及LeetCode题
四、栈与队列(Stack and Queue
五、树(Trees)
六、递归与回溯算法
七、动态规划
八、排序与搜索
九、哈希表
参考资料:
1、https://www.zhihu.com/question/23995189/answer/613096905

相关文章

  • 七、动态规划

    记录一下对动态规划的学习。在学习数据结构与算法的过程中,觉得比较难的一个算法思想就是动态规划了。它的应用实在是多,...

  • Algorithm进阶计划 -- 动态规划(上)

    动态规划动态规划的基本原理动态规划的运用 1. 动态规划的基本原理 动态规划(Dynamic Programmi...

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 《数据结构与算法之美》27——初识动态规划

    前言 今天开始学习动态规划,一共有三节,分别是:初识动态规划、动态规划理论、动态规划实战。今天这一节就是初识动态规...

  • 算法3:动态规划

    5.动态规划5.1 什么是动态规划?5.2 自底向上的动态规划:5.3 自顶向下的动态规划5.4 0-1背包问题:...

  • 动态规划

    动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...

  • Dynamic Programming(动态规划)类算法分析随笔

    #动态规划 关于动态规划,先摘一段[wiki][1]的描述: ``` 动态规划(英语:Dynamic progra...

  • 什么是动态规划

    目录 动态规划解决了什么 什么是动态规划 典型的动态规划 1. 动态规划解决了什么 的思想就是将大问题拆分成小问题...

  • 斐波那契数列

    递归解法 动态规划解法1 动态规划解法2

网友评论

      本文标题:七、动态规划

      本文链接:https://www.haomeiwen.com/subject/uagqrqtx.html