《征服数据结构》差分数组

摘要:

1,差分数组的介绍

2,二维差分数组的介绍

1,差分数组的介绍

差分数组主要是操作区间的,关于区间操作的数据结构比较多,除了前面讲的《稀疏表》,还有树状数组,线段树,伸展树Splay等。尤其是后面两个在信奥赛和蓝桥杯的比赛中用到的还是比较多的 ,之后我们也都会一一介绍、这里先看一下差分数组。

假设有这样一个问题,给你一个数组nums,先对区间a,b中每个元素加 3 ,在对区间c,d每个元素减 5 ...... ,这样非常频繁的区间修改,常规的做法可以一个个计算。

Java 代码:

go 复制代码
// 给闭区间[a,b]中的每个元素都增加 k 。
public void increment(int[] nums, int a, int b, int k) {
    for (int i = a; i <= b; i++) {
        nums[i] += k;
    }
}

C++ 代码:

go 复制代码
// 给闭区间[a,b]中的每个元素都增加 k 。
void increment(vector<int> &nums, int a, int b, int k) {
    for (int i = a; i <= b; i++) {
        nums[i] += k;
    }
}

频繁对数组的一段区间进行加减,如果一个个去操作,很明显效率很差,这个时候我们可以使用差分数组,差分数组就是原始数组相邻元素之间的差所构成的数组。定义差分数组dn,则 di = numsi − numsi−1 ,其中 d0 = nums0 。

可以看到原数组的元素就是差分数组的前缀和,如果要计算numsi,只需要把差分数组 d 的前 i 个元素相加即可。

ini 复制代码
nums[0] = d[0]
num[3] = d[0] + d[1] + d[2] + d[3]

有了差分数组,如果对区间 a,b 中的每个元素加 3 ,不需要在一个个操作,只需要在两端修改。如下图所示,可以看到原数组需要修改区间内的所有值,而差分数组只需要修改两个值即可,一个是给da加上 3 ,一个是给db+1减去 3 。

javascript 复制代码
d[a] += 3;
d[b+1] -= 3;// 注意不能越界
相关推荐
H.莓飛几秒前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
w_zero_one2 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David2 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David3 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪3 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪3 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
小羊没烦恼!5 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.5 小时前
202609CSP认证P3
算法
云淡风轻~窗明几净6 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心6 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机