差分数组简介
这道题是我头一次领略到差分数组的威力。以往听到这个名词,总是敬而远之,不知道这是个啥东西,也有点畏惧接触。直到碰到这个科普帖子,
才让我恍然大悟。原来差分数组就是离散函数的导数。早该知道到,差分的英文是differential,也有微分的意思。
- differential equations: 差分方程
- differentiable: 可微分的
我们回到离散数组, 其差分数组定义为
通俗理解就是,差分数组就是原数组相邻两项的增量构成的数组,并约定首项等于原数组首项。
研究差分数组主要因为它有一些性质。
性质1(积分):从左到右累加差分数组中的元素,即可得到原数组。即,
性质2:for and , , .
说明,
- 性质1就是离散积分的过程,因为差分数据是通过离散求导得到的,因此积分出来当然得到原函数。
- 性质2将原数组的一个区间的操作,转换为差分数组上两个边界的操作。大大降低了算法复杂度。更通俗的描述,
- 对原数组的子区间, 将都加上. 等价于,
- 把差分数组的增加,减少.
什么意思?利用性质2,我们可以原数组上对子区间的批量运算()转换成差分数组上的两次运算(),然后通过性质1复原数组。这在降低算法复杂度的时候非常有用!