To Boldly Go Where No One Has Gone Before|

园龄:粉丝:关注:

【算法学习笔记】前缀和与差分

前缀和与差分

本篇博客适合初学者阅读,如有不周之处,欢迎各位大佬指正!

  • 0.背景

想象一下,你有一个数组( 很长很长de那种 )你需要求出给定一段区间的和,并有多次询问,作为初学者你是否要for循环把他们都加起来呢?

  • 1.正文

前缀和

前缀和是一个数列A通过递推能够求出来的信息之一,顾名思义就是某个数前面所有单元数值之和。他的公式如下

Si=j=1iAj

对于给定数列A,我们可以通过如下代码实现前缀和


for(rg int i=1;i<=n;i++){
	S[i]=S[i-1]+A[i]
}

代码中的 S[i]=S[i1]+A[i] 就是前缀和的递推式

一个问题:如果我们想要求一个区间[l,r]的和,我们应该如何实现?

图示

由于S代表数列A的前缀和,我们想要求一个闭区间的和只需要去掉l之前的所有部分就行了

ans=i=lrAi=Srsl1

所以我们就求出了[l,r]的和

差分

对于一个给定数列A,它的差分数列C定义为

Bi=AiAi1 (2in)

差分可以看做前缀和的逆运算

你可以认为前缀和数列差分数列就是原数列差分数列前缀和数列也是原数列

利用差分,我们可以区间多次以O(1)复杂度区间修改一个数组

实现方法:

我们将原数组想象为高度不同的一片高楼(如下图)

//未完待续

本文作者:UssEnterprise

本文链接:https://www.cnblogs.com/UssEnterprise/p/12085229.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   UssEnterprise  阅读(168)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起