- 浏览: 546454 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
转载:http://blog.csdn.net/niushuai666/article/details/6677982
滚动数组的作用在于优化空间,主要应用在递推或动态规划中(如01背包问题)。因为DP题目是一个自底向上的扩展过程,我们常常需要用到的是连续的解,前面的解往往可以舍去。所以用滚动数组优化是很有效的。利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。
一个简单的例子:
斐波那契数列:
一般代码
#include<iostream> #include<cstdio> using namespace std; int Fib[25]; int fib(int n) { Fib[0] = 0; Fib[1] = 1; Fib[2] = 1; for(int i = 3; i <= n; ++i) Fib[i] = Fib[i - 1] + Fib[i - 2]; return Fib[n]; } int main() { int ncase, n, ans; scanf("%d", &ncase); while(ncase--) { scanf("%d", &n); ans = fib(n); printf("%d\n", ans); } return 0; }
利用滚动数组优化后代码为:
#include <iostream> #include <cstdio> using namespace std; int Fib[3]; int fib(int n){ if(n==0) return 0; if(n==1) return 1; Fib[0]=0; Fib[1]=1; for(int i=2;i<=n;i++){ Fib[2]=Fib[0]+Fib[1]; Fib[0]=Fib[1]; Fib[1]=Fib[2]; } return Fib[1]; } int main(){ int ncase, n, ans; scanf("%d", &ncase); while(ncase--) { scanf("%d", &n); //需要引入<cstdio> ans = fib(n); printf("%d\n", ans); //需要引入<cstdio> } return 0; system("pause"); //需要引入<iostream> return 0; }
滚动数组实际是一种节省空间的办法,时间上没啥优势,多用于DP中,举个例子吧:
一个DP,平常如果需要1000×1000的空间,其实根据DP的无后效性,可以开成2×1000,然后通过滚动,获得和1000×1000一样的效果。 滚动数组常用于DP之中,在DP过程中,我们在由一个状态转向另一个状态时,很可能之前存储的某些状态信息就已经无用了,例如在01背包问题中,从理解角 度讲我们应开DP[i][j]的二维数组,第一维我们存处理到第几个物品,也就是阶段了,第二维存储容量,但是我们获得DP[i],只需使用DP[i - 1]的信息,DP[i - k],k>1都成了无用空间,因此我们可以将数组开成一维就行,迭代更新数组中内容,滚动数组也是这个原理,目的也一样,不过这时候的问题常常是不 可能缩成一维的了,比如一个DP[i][j]需要由DP[i - 1 ][k],DP[i - 2][k]决定,i<n,0<k<=10;n <= 100000000;显然缩不成一维,正常我们应该开一个DP[100000005][11]的数组,结果很明显,超内存,其实我们只要开DP[3] [11]就够了DP[i%3][j]由DP[(i - 1)%3][k]和DP[(i - 2)%3][k]决定,空间复杂度差别巨大
推荐题目:
POJ1159
POJ1717
POJ1745
发表评论
-
快排备忘
2013-10-26 11:27 597http://hi.baidu.com/pluto455988 ... -
LRU简单实现C++
2013-10-17 10:52 4046页面置换算法: 在地址映射过程中,若在页面中发现所要访问的页 ... -
二叉树相关
2013-10-04 17:40 734本节主要是为了写二叉树类型题目练手的代码,重点培养运用“指针 ... -
双指针策略(《编程之美》3.5 最短摘要生成)
2013-03-26 15:17 2259本文源自《编程之美》3.5 最短摘要生成一课。 ... -
K-MEDOIDS聚类算法
2012-12-04 21:18 2014k-medoids聚类算法 (wiki上讲得很清楚啊:) ) ... -
搜索(三)——回溯
2012-11-23 15:23 1063一、回溯 和 深度搜索 ... -
哈希Hash
2012-11-21 14:42 1014要点一:哈希表长度 的确定是个两难的问题:太短则容 ... -
状态压缩DP
2012-11-14 20:27 774引例、 例1、 例2、 例3、 ... -
模拟退火
2012-10-28 16:34 1239引用:http://www.cnblogs.com/heaad ... -
计算几何(一)——基础算法
2012-07-12 21:07 1942待续 《计算几何资料》为提纲 1. (1) 有向线段 ... -
计算几何(二)——平面最近点对
2012-07-12 10:54 929参考资料: 为何这个问题采用分治法 http://blog ... -
气泡滚大——剔除线性数据中的杂质
2012-06-18 09:43 985这是一道Java的面试题,但是我总结了除了一种自称为“ ... -
深入理解二分查找(二、二分答案)
2012-04-29 16:24 7231二分答案 如果已知候选答案的范围[min,max ... -
P问题、NP问题和NPC问题
2012-04-25 16:36 1091这篇文章转自这里 ... -
RMQ(Range Minimum/Maximum Query)区间最值查询
2012-04-18 20:47 1600一、RMQ问题描述 和 几种解题思路 RMQ问题 (Rang ... -
后缀数组
2012-04-16 09:49 1554一、后缀数组 及其对应的名次数组 举例:S=&quo ... -
大整数运算(部分转载)
2012-04-12 21:36 1215待补充:“浮点数高精度运算” 参见这里==> ... -
单向链表相关
2012-04-10 16:42 1008单向链表是微软笔试常考的,参考这里:http://www.c ... -
关键路径(AOE)
2012-04-10 08:05 1697前面这段话是引用别人的,后面代码是自己写的,有待完善: ... -
搜索(二)——双向BFS
2012-03-24 17:18 3055参考这篇文章,以下前 ...
相关推荐
标题“滚动数组应用:POJ 1159”指的是一个关于编程竞赛问题的解决方案,该问题在POJ(Programming Online Judge)平台上被提出。滚动数组是一种优化动态规划算法的技术,通过巧妙地重用和更新已经计算过的状态,减少...
### 滚动数组在云计算和分布式系统中的应用 #### 一、滚动数组在云计算中的分布式存储 **1.1 滚动数组通过数据分片实现分布式存储** 滚动数组在分布式存储中扮演着关键角色,它通过将数据划分成较小的块(分片)...
Java 滚动数组计算编辑距离操作示例 Java 滚动数组计算编辑距离操作是一个非常重要的技术,涉及到 Java 字符串与数组的遍历、计算、转换等相关操作技巧。编辑距离(Edit Distance),也称 Levenshtein 距离,是指由...
[二维数组](https://so.csdn.net/so/search?q=%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84&spm=1001.2101.3001.7020)及滚动数组 118、119、661、598、419 数组的旋转 189、396 特定顺序遍历二维数组 54、59、498 二维数组...
为了实现空间复杂度的优化,可以采用滚动数组技术,将三维数组F[i][j][k]简化为二维数组F[j][k],因为i的值始终递增,无需保存所有i的历史状态。这将空间复杂度降低到O(N * Sum/2),其中N是序列的长度。 在找到最优...
其基本思想是建立一个二维数组LCS[len1+1][len2+1],其中len1和len2分别是两个字符串的长度。LCS[i][j]的值表示字符串1的前i个字符和字符串2的前j个字符的最长公共子序列的长度。初始化时,当i或j为0时,LCS[i][j]的...
用滚动数组实现最大路径问题
在编程领域,"凑和"通常...在实际应用中,还需要考虑优化算法,如剪枝操作以减少回溯法中的无效计算,或者使用滚动数组来降低动态规划的空间复杂度。同时,对于不同的问题规模和需求,可能需要灵活选择适合的解题方法。
斐波那契数列的几种时间复杂度优化 以下代码因不同算法而时间复杂度不同个人归类为不同版本,总结...3.以下利用到了动态规划的滚动数组。 4.用位运算来代替乘法、除法以及取模。 5.有数学公式用数学公式@.@....
4. 滚动数组:在解决乘积最大问题时,可以使用滚动数组来降低空间复杂度。 本文生成的知识点涵盖了进制转换、动态规划、高精度乘法、滚动数组等多个编程领域的知识点,对于编程爱好者和青少年信息学选手具有重要的...
`myArray`是我们的滚动数组,`MAX_RECORDS`定义了最大可存储的记录数。 接下来,我们需要编写处理新数据到来的逻辑。每当有新数据要记录时,SCL代码会检查当前数组是否已满: ```scl IF myArray.UsedRecords 如果...
- **时间空间复杂度**:常规方法为O(N*V),使用滚动数组优化后空间复杂度可降低到O(V)。 2. **完全背包问题**: - **问题描述**:与01背包相似,但每种物品可以有无限数量。 - **特点**:每种物品可无限次放入...
我们可以使用一个二维数组来存储状态d(i,j),然后使用滚动数组来优化空间。 现在,让我们来看LIS问题。给定一个序列,我们想找到最长上升子序列。为了解决这个问题,我们可以使用动态规划的方法。我们定义状态d(i)...
C++的二维动态规划数组可以有效地处理这个问题,同时滚动数组技术可以减少内存消耗。 T4的宿舍楼问题是一个基于图的最短路径问题,我们可以使用动态规划来求解。定义状态表示到达特定位置所需的时间,通过转移方程...
- **O(nlogn)算法**虽然在理论上的时间复杂度更高,但由于采用了滚动数组优化了空间复杂度,使其在实际应用中更加高效。 通过上述介绍可以看出,选择哪种算法取决于具体的应用场景和对时间和空间复杂度的要求。
在优化方面,可以通过简化状态转移方程以及使用滚动数组的方式来降低空间复杂度,使得算法更加高效。 第三个问题:多重背包问题,它介于01背包和完全背包之间。在这种情况下,每种物品有若干个可供选择,类似于购物...
代码实现(滚动数组优化)dp := 0 // 用一个值当做滚动数组使用i := -1 // i表示前面最近的s[j]==s[i]的位置if dp < j-i {
完全背包的一维滚动数组优化与01背包相似,但需要注意的是更新顺序应从后向前进行,避免更新过程中覆盖掉还未使用的值。 ```cpp #include using namespace std; int v[1005], w[1005], f[1005]; int main() { ...
这被称为滚动数组优化。 总的来说,"Roberry_house_dynamicprogramming_源码"涉及的核心知识点包括: 1. 动态规划的基本概念和应用 2. 状态转移方程的建立 3. 数组和变量的使用来存储中间结果 4. 最优化问题的解决...
1. **滚动数组**:通过只保留上一行的状态来减小空间需求,这样只需O(min(m, n))的空间,其中m和n分别是两个字符串的长度。 2. **自底向上**:从短字符串到长字符串逐步求解,避免了从长向短回溯的过程,提高了效率...