滾動數組


利用在數組長度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一樣的效果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM