以下是自己对于滚动数组的自己理解,有错误的地方各位可以提出来。
滚动数组是DP中的其中一个简单的算法,更确切的说是一种编程思想。
简单的理解就是让数组滚动起来,每次都使用固定的几个存储空间,来达到压缩,节省存储空间的作用。
具体可以优化DP或者递推中的空间,在数据量很大的时候起到压缩的作用。
Example:
求斐波拉切数列,先用正常的方法求解。
int d[]=new int[100];
d[0]=1;d[1]=1;
for(int i=2;i<100;i++)
{
d[i]=d[i-1]+d[i-2]
}
System.out.printf("%d",d[99]);
此处可以看到这里,如果求解99位,那么需要使用将近快100个存储单元。
接下来使用滚动数组的思想:
int d[]=new int[3];
d[0]=1;d[1]=1;
for(int i=2;i<100;i++)
{
d[i%3]=d[(i-1)%3]+d[(i-2)%3];
}
System.out.printf("%d",d[99%3]);
这里无论求多少个,只需要留出三个存储单元的位置即可。
这样在使用的时候就可以降低开销,对于某些固定的问题就可以很容易的解决掉。
在时间上没有什么优化,有些甚至是牺牲时间换空间的道理。所以使用的时候,选择适合的比较重要。