滚动数组
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一样的效果。
以上是关于滚动数组的主要内容,如果未能解决你的问题,请参考以下文章