差分数组(HackerRank Array Manipulation)

差分数组(HackerRank Array Manipulation)

学过树状数组之后,比较线段树,我们想有没有一种与树状数组相关的能够达到快速进行区间更新的方法,这就是差分数组。差分数组可以只通过修改区间端点值达到区间修改的目的,同时结合树状数组,可以达到快速单点查询的目的。

  • 定义
    对于已知有n个元素的离线数列A,我们可以建立记录它每项与前一项差值的差分数组F,
    显然,F[1] = A[1] - 0 = A[1] ; 对于整数i∈[2…n],我们让F[i] = A[i] - A[i-1] 。
    这样,得到的数组 F[ ] 就是我们所说的差分数组。

  • 性质
    1.计算数列各项的值:
    观察 d[2]=f[1]+f[2]=d[1]+d[2]-d[1]=d[2] 可知,由查分数组的定义容易知道,数列第 i 项的值是可以用差分数组的前 i 项的和计算的,即 A[i] = F[1] + F[2] + … + F[i] 。例如: A[2] = A[1] + A[2] - A[1] = F[1] + F[2] 。
    在这个问题上,可以通过树状数组维护区间和,达到快速查询某一项的值的目的。
    2.计算数列A[ ]的前缀和(前 i 项和):
    由下述公式可以直接得到前缀和。
    在这里插入图片描述

  • 应用
    1.快速处理区间加减操作:
    通过性质1很容易知道,如果对区间 [L, R] 进行修改时,区间内部元素之间的差值是不受影响的,对应到差分数组上就是区间内的值不变,受到影响的是差分数组中区间两端的值。例如,区间 [L, R] 内的值同时加上 k 时,区间左端的值与前一位数的差值就会多 k ,区间右端的值的下一位(F[R+1])与区间右端的值的差就会减少 k ,最后结果就是 F[L] += k , F[R+1] -= k 。
    2.区间和:
    求区间和,通过前缀和相减即可。例如求区间 [L, R] 的值的和,则 sum([L, R]) = sumR - sumL-1
    树状数组可以看一下另一篇博客:树状数组

发布了7 篇原创文章 · 获赞 1 · 访问量 505

猜你喜欢

转载自blog.csdn.net/weixin_44193527/article/details/104267249