码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划之斐波那契数列

时间:2019-12-16 13:12:46      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:top   优化   ping   ati   sys   最优   else   app   int   

动态规划之斐波那契数列

动态规划是将一个问题切分成子问题并将子问题的结果存储起来避免重复计算的一种算法。

它有两个要件:

1)重复子问题

2)最优子结构

  • 和分治法一样,动态规划也是有自己的子问题,所以如果没有重复子问题,那么动态规划就无法使用,因为动态规划的作用就是存储重复子问题的值;反例是,二分查找,在二分查找中,并没有重复子问题。

技术图片

在斐波那契数列中,fib(3)被计算多次,如果我们能够存储fib(3)的值,则可以优化算法。

接下来有两种算法来优化问题:

1)Memoization (备忘录)

2) Tabulation (制表)

备忘录是(top down)的方法,备忘录方法中的问题类似于回归问题,它在计算前会在查找表中修正数据。首先我们使用查找数组初始化数据,无论何时我们需要子问题的解决方法,我们首先看一下查找表中的数据,否则我们计算值并将其放在查找表中。

public class Fibonacci {


        int NLF  = -1;
        int MAX  = 100;
        int[] array = new int[MAX];


        void _initialize()
        {
            for(int i=0;i<MAX;i++)
            {
                array[i] = NLF;
            }

        }



        int fib(int n) {
            if (array[n] == NLF) {
                if (n <= 1) {
                    array[n] = n;
                } else {
                    array[n] = fib(n - 1) + fib(n - 2);
                }
            }
            return array[n];
        }


    public static void main(String[] args)
    {
        Fibonacci f = new Fibonacci();
        f._initialize();
        System.out.println(f.fib(40));
    }

}


制表是自底向上(bottom up)的方法,它的做法是从最后一个实体开始,往上计算,最后得到结果。
例如斐波那契数列,它从fib(0),fib(1),fib(2)等等算起。


public class Fibonacci {



    int fib(int n)
    {
        int[] array = new int[n+1];


        array[0] = 0;
        array[1] = 1;


        for(int j=2;j<=n;j++)
        {
            array[j] = array[j-1]+array[j-2];
        }

        return array[n];

    }




    public static void main(String[] args)
    {
        Fibonacci f = new Fibonacci();

        System.out.println(f.fib(40));
    }

}


我们可以看到,备忘录和制表这两种方法都存在存储数据,只不过在备忘录中,它是由上至下的,所以存在递归循环。而在制表中,它是自下而上的,只需要一个数组存储值进行循环即可。

References:

Overlapping Subproblems Property in Dynamic Programming | DP-1

动态规划之斐波那契数列

标签:top   优化   ping   ati   sys   最优   else   app   int   

原文地址:https://www.cnblogs.com/zhichun/p/12048451.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!