C++滚动数组(优化空间)

滚动数组是一种在时间充足而空间有限的情况下,通过数组值的交换来节省空间的策略,常见于动态规划和递推问题。以斐波那契数列为例子,通常需要num[N]数组,但通过滚动数组优化,只需num[3]即可,通过不断更新数组元素位置,如num[0] = num[1] + num[2],num[2] = num[1],num[1] = num[0],达到空间优化的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

滚动数组简介

滚动数组顾名思义就是让数组滚起来,是一种用时间去换空间的想法,往往在时间充足,空间超限的情况下适用。

滚动数组基本上都是在动态规划DP和递推中使用,大部分都是通过数组中的值结合其他的数更新数组中的某一位,之后在数组中交换数值的位置,再更新下一位。

滚动数组应用实例

就以斐波那契数列为例
斐波那契数列:1,1,2,3,5,8,13,21……

如果我们要求第i位的数值,往往都会用num[i] = num[i - 1] + num[i - 2]。这样就要开一个num[N]的数组了。可是如果运用了滚动数组的优化,就只用开num[3]了,每次让num[0] = num[1] + num[2]之后再让num[2] = num[1],num[1] = num[0]就OK了。这样就大大优化了空间。

以下为斐波那契数列滚动数组优化了的代码

# include <cstdio>
# include <iostream>
# include <cmath>
# 
### 滚动数组与压缩数组的概念及用法 #### 概念定义 滚动数组是一种优化技术,主要用于动态规划问题中降低空间复杂度。其核心思想是利用状态转移方程的特点,仅保留计算当前状态所需的部分历史状态,从而避免存储整个多维数组[^1]。 相比之下,压缩数组则是通过对原始数据进行某种形式的转换或编码,减少存储需求的技术。这种技术通常依赖于数据本身的特性(如连续性、重复性),并通过特定算法实现更高效的表示方式[^4]。 --- #### 实现方式对比 ##### **滚动数组** 滚动数组的核心在于通过调整遍历顺序和更新策略,使得一维数组可以替代传统的二维 dp 数组。以下是其实现的关键点: - 遍历顺序:当使用一维 `dp` 数组时,为了防止覆盖未使用的旧值,需采用倒序遍历的方式处理背包容量[^2]。 - 更新逻辑:每次迭代只涉及有限数量的状态变量,因此可以用较小的空间保存必要的中间结果。 下面是一个基于 C++ 的简单例子展示如何运用滚动数组求解斐波那契数列: ```cpp #include <iostream> using namespace std; int main() { int a[3]; a[0] = 1; a[1] = 1; for (int i = 1; i <= 35; ++i) { // 计算第36项Fibonacci数值 a[2] = a[0] + a[1]; // 新状态由前两个状态决定 a[0] = a[1]; // 移动指针保持最新三个状态即可 a[1] = a[2]; } cout << a[2] << endl; return 0; } ``` 此代码片段展示了如何借助少量固定大小的缓冲区完成原本可能需要线性增长内存的任务[^3]。 --- ##### **压缩数组** 压缩数组则更多关注于原始输入数据结构本身是否存在冗余或者模式可被挖掘出来加以简化表达。例如,在面对一系列接近均匀分布的数据集合时,我们可以记录初始基准值加上后续变化量构成的新序列作为代替方案;这样既节省了绝对位置信息又不失原意。 具体操作如下所示: 假设有一系列整型数字 `{8, 19, 26, 39, 41, 47, 62, 74}` ,如果直接储存每条独立记录的话总共占用约 \(4 \times 9 = 36\) 字节资源。然而注意到相邻成员之间差距不大这一事实之后便能设计更加紧凑的形式——即先指定起始参照物再列举其余各步增减幅度形成最终产物 `[85103], [8, 19, 26, 39, 41, 47, 62, 74]`. 这种方法尤其适合那些具有较强规律性的大数据集场合下应用实践当中去探索发现潜在价值所在之处。 --- #### 使用场景区别 | 特性/类别 | 滚动数组 | 压缩数组 | |-------------------|---------------------------------------------|--------------------------------------------| | 主要目标 | 减少 DP 中间过程中的临时存储开销 | 缩短长期存档文件长度 | | 数据特征要求 | 不改变原有业务语义下的局部最优子结构性质 | 存在明显趋势或周期特性的大规模静态资料库 | | 技术难度等级 | 较易理解并实施 | 对领域专业知识有一定门槛 | 综上所述可以看出两者虽然都致力于提升效率但是侧重点完全不同而且适用范围也互有侧重所以应该根据实际情况灵活选用合适的方法论来进行开发工作之中. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值