zoukankan      html  css  js  c++  java
  • 滚动数组

    利用在数组长度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一样的效果。

  • 相关阅读:
    广播和多播
    nohup和&后台运行,进程查看及终止
    Java知识汇总——思维导图
    linux 基础命令使用
    scp命令详解
    linux 安装crontab执行定时任务
    linux磁盘挂载
    虚拟机安装网络设置
    Android直播实现srs流媒体服务器部署
    java的(PO,VO,TO,BO,DAO,POJO)解释
  • 原文地址:https://www.cnblogs.com/hrlsm/p/12826486.html
Copyright © 2011-2022 走看看