Dynamic Programming 类问题的空间优化方法 - 滚动数组

以斐波那契数列为例 来看一下 滚动数组 是如何节约空间的

传统方式:如果想求解fib(7) 需要8个数组空间

0 1 1 2 3 5 8

通过观察 我们可以发现 求解fib(n) 我们只关心fib(n-1)和fib(n-2) 对再之前的数据并不关心 也就是可以认为是无效数据 这种特征特别适用于动态规划类题目

而利用滚动数组 我们只需要3个数组空间

0 1 1 

 1 1 2 

       1 2 3 

          2 3 5 

             3 5 8

 传统方式:

    Fib[0] = 0;
    Fib[1] = 1;
    Fib[2] = 1;
    for(int i = 3; i <= n; ++i)
        Fib[i] = Fib[i - 1] + Fib[i - 2];
    return Fib[n];

 

 滚动数组:

    Fib[1] = 0; 
    Fib[2] = 1;
    for(int i = 2; i <= n; ++i)
    {
        Fib[0] = Fib[1]; 
        Fib[1] = Fib[2];
        Fib[2] = Fib[0] + Fib[1];
    }
    return Fib[2];

 

posted @ 2020-03-12 08:59  okay4321  阅读(131)  评论(0编辑  收藏  举报