动态规划

2023-05-16

动态规划是20世纪50年代由Richard Bellman发明的。不像贪婪算法,回溯算法等,单从名字上根本理解不了这是什么鬼。Bellman自己也说了,这个名字完全是为了申请经费搞出来的(),所以说这个名字坑了一代又一代的人啊。

言归正传,我们来了解下动态规划,dynamic Programming,是一种高效解决问题的方法,使用与具有重复子问题最优子结构的问题。(又是两个搞不懂的名词啊)。不过没问题,我们可以通过举例子来说明。

如果可以把局部子问题的解结合起来得到全局最优解,那这个问题就具备最优子结构
如果计算最优解时需要处理很多相同的问题,那么这个问题就具备重复子问题

就像看上了一个女孩,不能直接上去泡人家,要先制造一次偶遇一样,这里我们先从一个简单的问题来认识动态规划。

Fibonacci sequence

fibonacci数列是递归算法的一个典型的例子,这里不介绍了,大家都懂,直接上代码:

import time

def Fibnacci(n):
    if n==0 or n==1:
        return 1
    else:
        return Fibnacci(n-1) + Fibnacci(n-2)

num=37 
start = time.clock()
Fibnacci(num)
end = time.clock()
print "Fibnacci sequense costs",end-start

结果耗时:

Fibnacci sequense costs 14.9839106433

这速度也是醉了啊,这才是37位啊,手算也就2分钟的事啊。
如果试下Fibnacci(120) ,这个千万不敢试,会怀孕,说错了,是会看不到明天的太阳。(官方统计算完基本上要250000年

那么为什么会这么慢呢。我们以Fibnacci(5) 位例子,每次计算Fibnacci(5) 都要计算Fibnacci(4)Fibnacci(3) ,而Fibnacci(4)要计算Fibnacci(3)Fibnacci(2)Fibnacci(3)要计算Fibnacci(2)Fibnacci(1) ,一直这样递归下去,作了大量的重复计算。而函数调用时很费时间和空间的。

有一个图很好的说明了这个问题:
Fibnacci树图

既然重复计算如此耗时,那么能不能不重复计算这些值呢?当第一次计算了这些值的时候,我们把他们缓存起来,等到再次使用的时候,直接把他们拿过来用,这样就不用做大量的重复计算了。这就是动态规划的核心思想。

还是以Fibnacci为例子:
每当我们第一次计算Fibnacci(n)的时候,我们就将其缓存到memo的列表中,当需要再次计算Fibnacci(n)的时候,首先去memo的列表中查找,如果找到了就直接拿来用,找不到再计算。下面是具体的程序:

def fastFib(n,memo={}):
    if n==0 or n==1:
        return 1
    try:
        return memo[n]
    except KeyError:
        result = fastFib(n-1,memo) + fastFib(n-2,memo)
        memo[n] = result
        return result

实验下效果;

n=120
start = time.clock()
fastFib(n)
end = time.clock()
print "Fibnacci sequense costs",end-start   

Fibnacci sequense costs 0.00041543479823

这就是差距啊!从算法复杂度上来讲这次的算法每次只调用fastFib函数一次,所以复杂度为O(n)
这就是差距的原因。

下一章节将是如何利用动态规划来解决0/1背包问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划 的相关文章

随机推荐

  • 第三十二篇:Windbg中USB2.0调试环境的搭建

    2011年的时候 xff0c 为了开发USB Mass storage UASP USB attached SCSI Protocol 的设备驱动程序 xff0c 从米国买了两个USB2 0的调试小设备 xff08 如下图 xff0c 每个
  • 理解SerDes 之一

    理解SerDes FPGA发展到今天 xff0c SerDes Serializer Deserializer 基本上是标配了 从PCI到PCI Express 从ATA到SATA xff0c 从并行ADC接口到JESD204 从RIO到S
  • 理解SerDes 之二

    理解SerDes 之二 2012 11 11 21 17 12 转载 标签 xff1a dfe serdes it 2 3 接收端均衡器 Rx Equalizer 2 3 1 线形均衡器 Linear Equalizer 接收端均衡器的目标
  • USB3.0的物理层测试探讨

    USB简介 USB Universal Serial Bus 即通用串行总线 xff0c 用于把键盘 鼠标 打印机 扫描仪 数码相机 MP3 U盘等外围设备连接到计算机 xff0c 它使计算机与周边设备的接口标准化 在USB1 1版本中支持
  • ARM SoC漫谈

    作者 xff1a 重走此间路 链接 xff1a https zhuanlan zhihu com p 24878742 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 芯片厂商向客户介
  • linux下实现生产者消费者问题

    生产者 xff08 producer xff09 和消费者 xff08 consumer xff09 问题是并发处理中最常见的一类问题 xff0c 是一个多线程同步问题的经典案例 可以这样描述这个问题 xff0c 有一个或者多个生产者产生某
  • 解决Ubuntu下每隔几分钟自动锁屏,需要重新输入密码的问题

    看到这篇文章 xff0c 很实用 xff0c mark xff01 http www cnblogs com lanxuezaipiao p 3617436 html
  • Android NFC详解

    1 NFC概览 NFC xff0c 全称是Near Field Communication xff0c 中为近场通信 xff0c 也叫做近距离无线通信技术 使用了NFC技术的设备 xff08 例如移动电话 xff09 可以在彼此靠近的情况下
  • Microsoft VBScript 运行时错误 错误 '800a01a8' 缺少对象: ''

    Microsoft VBScript 运行时错误 错误 39 800a01a8 39 缺少对象 39 39 通常是这个对象已经关闭了 xff0c 你现在又关闭一次 xff01 xff01
  • 0/1背包问题之穷举解法

    0 1背包问题 有一个背包 xff0c 背包容量是M 61 150kg 有7个物品 xff0c 物品不可以分割成任意大小 xff08 这句很重要 xff09 要求尽可能让装入背包中的物品总价值最大 xff0c 但不能超过总容量 物品 A B
  • 把数据转换成json格式的字符串

    最近写程序遇到一个问题 xff0c 把一些数据转换成json格式的字符串保存起来 xff0c 这些数据有普通的键值对 xff0c 还有列表类型的 xff0c 下面写了一个小例子 xff0c 列表数据以复选框CheckBox形式来展示 xff
  • 解决Ubuntu12.04循环登录的问题

    今天用VMvare登录Ubuntu xff0c 发现用户名密码正确的情况下 xff0c 登录不进去 xff0c 循环出现登录界面 xff0c 但是guset可以登录 xff0c 在网上查找资料 xff0c 找到了解决的办法 xff1a 1
  • 美团2018春招笔试题

    任意一个正整数可以用字符 0 9 表示出来 但是当这些字符每种字符数量有限时 xff0c 可能有些正整数表示不出来 比如有两个 1 xff0c 一个 2 xff0c 能表示出11 12 112等等 xff0c 但是无法表示出10 122 2
  • GooglePlay - 排行榜及支付接入

    前言 Google Play应用商店在国外Android市场中地位基本与AppStore在IOS中的地位一致 xff0c 为此考虑国外的应用时 xff0c Android首要考虑的是接入GooglePlay的排行榜等支持 同样的由于Goog
  • 极光推送-点击通知栏跳到指定页面

    在MyReceiver接收器里面 xff0c 添加以下代码 xff1a if JPushInterface ACTION NOTIFICATION OPENED equals intent getAction Log d TAG 34 My
  • Android 5.0以上Button去掉阴影

    1 xff0c 在Button标签中直接添加以下属性 style 61 android attr borderlessButtonStyle 2 xff0c 有的Button的属性已经抽成style 此时直接在style时添加上parent
  • Tinker接入小白教程

    在这里先给大家拜个晚年 xff0c 虽然说新已经过了 本文是今天第一篇文章 xff0c 已经有好长时间没总结了 xff0c 算了给2017开个好头吧 之前一直搞不懂什么是热修复 xff1f 其实热修复就是在应用不用重新安装的情况下更新应用
  • 扫盲Android Studio 仓库jCenter并发布自己的开源库

    AS从哪里获取到开源库 首先我们在使用第三方开源库时 xff0c 直接在项目的 gradle 文件中添加这样一行代码 xff1a compile 39 com jakewharton butterknife 7 0 1 39 添加完之后 x
  • Mac安装android studio后卡在building gradle project info的解决方法

    1 找到 gradle目录 xff0c 一般在 User lt 用户名 gt 下 macOS Sierra 10 12 3可以直接快捷键 shift 43 command 43 显示隐藏的文件即可看到 gradle文件夹 2 进入 grad
  • 动态规划

    动态规划是20世纪50年代由Richard Bellman发明的 不像贪婪算法 xff0c 回溯算法等 xff0c 单从名字上根本理解不了这是什么鬼 Bellman自己也说了 xff0c 这个名字完全是为了申请经费搞出来的 xff08 囧