滚动数组

Posted hrlsm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滚动数组相关的知识,希望对你有一定的参考价值。

利用在数组长度N很大的情况下能达到压缩存储的作用。一般还是用在DP题目和递归中,因为DP题目是一个自下而上的扩展过程,我们常常用到是连续的解,而每次用到的只是解集中的最后几个解,所以以滚动数组形式能大大减少内存开支。

比如:斐波那契数列

#include<iostream>
using namespace std;
int main()
{
    int i;
    long long d[80];
    d[0]=1;
    d[1]=1;
    for(i=2;i<80;i++)
    {
        d[i]=d[i-1]+d[i-2];
    }
   cout<<d[79]<<endl;
    return 0;
}

上面这个循环d[i]只需要解集中的前2个解d[i-1]和d[i-2];

为了节约空间用滚动数组的方法

#include<iostream>
using namespace std;
int main()
{
    int i;
    long long d[3];
    d[0] = 1;
    d[1] = 1;
    for(i=2;i<80;i++)
    {
        d[i%3]=d[(i-1)%3]+d[(i-2)%3];
    }
    cout<<d[79%3]<<endl;
    return 0;
}

再比如二维数据:

int i, j, d[100][100];
for(i = 1; i < 100; i++)
    for(j = 0; j < 100; j++)
        d[i][j] = d[i - 1][j] + d[i][j - 1];

上面的d[i][j]只依赖于d[i - 1][j], d[i][j - 1]; 

用滚动数组:

int i, j, d[2][100];
for(i = 1; i < 100; i++)
    for(j = 0; j < 100; j++)
        d[i % 2][j] = d[(i - 1) % 2][j] + d[i % 2][j - 1];

滚动数组实际是一种节约空间的办法,时间上没什么优势,比如:

一个DP,平常如果需要1000×1000的空间,其实根据DP的特点,能以2×1000的空间解决问题,并且通过滚动,获得和1000×1000一样的效果。

 

以上是关于滚动数组的主要内容,如果未能解决你的问题,请参考以下文章

带有两个列表片段的可滚动布局

jQuery 平滑滚动片段以不同的速度工作

如何在滚动视图中设置谷歌地图片段

Android使用片段在viewpager中的页面滚动上放置动画

iphone SDK:不能在图像数组中对角滚动?

VSCode自定义代码片段—— 数组的响应式方法