【算法】动态规划法(斐波那契数列)

动态规划 用于求解最优化子问题的,往往是高效的而准确的。这背后的逻辑,其实就是程序设计的最基本原理——不要让程序做重复的事情

一句话说算法

对于一个复杂的问题,可以分解成若干个子问题来解决,这是分治法。每个分解的子问题,得到最优解,再通过一个方式组合这些最优解,得到全局最优解,这是贪心法。而其实分解的子问题,往往会有许多重复的子问题,对程序进行减枝机制地优化,这是动态规划法

斐波那契数列

大学课堂上,讲C语言课程的老师,一定讲过斐波那契数列

通俗的话讲,这个数列中的第2项(从零开始计数)之后的每一项,是前两项之和。基础项,也就是第0项是0,第1项是1,以此类推得出的一个数列:

0,1,1,2,3,5,8,13,21...

朴素算法的实现是:

 def fib(n):
    if n == 0:
        return 0

    if n == 1:
        return 1

    return fib(n-1) + (n-2) 

这个递归算法有大量的重复步骤,例如:fib(3) = fib(2) + fib(1), fib(4) = fib(3)+fib(2)。这两个步骤中fib(2)就是被重复计算了,这样的算法固然正确,但是效率太对。数据量增大,算法的时间复杂度也是指数级增大。

为了避免重复的计算操作,可以将分解的子问题的解,用一个字典存起来。每次判断如果字典中已经有了计算过得值,则不再进行计算,直接取值就可以了。这样便大大减少了算法的计算量,下面是我用python的实现:

d = {}

def fib(n):
    if(n==0):
        d[n] = 0
        return 0

    if(n==1):
        d[n]=1
        return 1

    if not d.has_key(n) :
        d[n] = fib(n-1) + fib(n-2)
    return d[n]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 递归算法就是通过解决同一问题的一个或多个更小的实例来最终解决一个大问题的算法。为了在C语言中实现递归算法,常常使用...
    鱼仔_1625阅读 1,088评论 0 1
  • 前段时间一直写了几个算法题目,发现有个很牛逼的算法,动态规划,虽然有的解题思路和动态规划很像,但是当时不知道其中的...
    杀手Kira阅读 1,967评论 2 5
  • 递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨...
    march_1991阅读 4,116评论 0 2
  • 南国的雨下的真是任性,一大清早就听到窗外噼噼啪啪,听到这声音不知怎么的就又睡着了。一直睡到中午,这雨还是丝毫没有停...
    阿尚_阅读 237评论 0 0
  • 红绸绳 对妆镜 纤手游走 眉目飞舞 束起的发间 活像蝴蝶停留 圆舞台 轻音乐 烟雾缭绕 灯光闪烁 曼妙的舞姿 蝴蝶...
    拈花一笑sun阅读 320评论 0 1