前缀和(Prefix Sum)和差分(Difference Array)是处理数组问题时常用的两种数据结构或算法技巧,它们可以加速某些类型的查询,尤其是在涉及数组元素累积和或变化量的情况下。
前缀和(Prefix Sum)
前缀和是一种将数组元素的累积和存储在新数组中的技术。对于一个数组 a
,其前缀和数组 prefixSum
定义如下:
prefixSum[i] = a[0] + a[1] + ... + a[i-1]
这样,你可以在 O(1) 时间内查询数组 a
中任意子区间 [l, r)
(左闭右开)的和,计算方式为:
sum = prefixSum[r] - prefixSum[l]
用途:
- 快速计算任意子区间的元素和。
- 处理与数组元素累积和有关的问题。
实现
vector<int> computePrefixSum(const vector<int>& a) {
int n = a.size();
vector<int> prefixSum(n, 0);
for (int i = 1; i <= n; ++i) {
prefixSum[i] = prefixSum[i - 1] + a[i - 1];
}
return prefixSum;
}
差分(Difference Array)
差分数组是一种基于原数组生成新数组的技术,新数组中的每个元素是原数组中相邻元素的差。对于一个数组 a
,其差分数组 diff
定义如下:
diff[i] = a[i] - a[i - 1]
(对于 i > 0
,diff[0] = a[0]
)
这样,你可以在 O(1) 时间内恢复原数组的任意元素,或者快速计算任意子区间的和。
用途:
- 快速修改数组中的元素(例如,对某个区间的所有元素同时加上或减去一个值)。
- 处理与数组元素变化量有关的问题。
实现:
vector<int> computeDifference(const vector<int>& a) {
int n = a.size();
vector<int> diff(n, 0);
diff[0] = a[0]; // 第一个元素没有前一个元素,所以直接赋值
for (int i = 1; i < n; ++i) {
diff[i] = a[i] - a[i - 1];
}
return diff;
}
前缀和和差分都是处理数组问题的有效工具,它们可以显著提高某些类型问题的解决效率。在实际应用中,选择哪一种技术取决于问题的具体需求。
标签:前缀,元素,差分,vector,数组,diff From: https://blog.csdn.net/makeke123456/article/details/144932084