算法笔记方法论5 差分 & 前缀和

这篇博客介绍了差分法和前缀和法在处理区间问题中的应用,包括它们的特点、时间复杂度和解题思路。差分法用于区间加减操作,将操作转化为对端点的处理,降低时间复杂度到O(n);前缀和法用于区间求和,通过端点值的减法实现O(1)的查询速度。文中还提供了算法通用模板和具体题目的示例。
摘要由CSDN通过智能技术生成

差分与前缀和是一对互逆的操作,常常用于处理区间问题,差分法是解决区间加减问题,前缀和是解决区间求和问题的常用办法。

知识点

  • 差分算法
  • 前缀和算法

差分法

差分法的应用主要是用于处理区间问题。当某一个数组要在很多不确定的区间,加上相同的一个数。我们如果每个都进行加法操作的话,那么复杂度 O(nm) 是平方阶的,非常消耗时间。

如果我们采用差分法,将数组拆分,构造出一个新的拆分数组,通过对数组区间的端点进行加减操作,最后将数组和并就能完成原来的操作。

这样处理后,时间复杂度降低为 O(N),虽然感觉操作变得更加复杂了,但是只用对边界操作确实比操作一整个区间的方法要优秀的多。

听到这里也是吊足了胃口,那到底怎么对区间操作呢,请大家跟随我的讲解,慢慢理解。

差分法的特点:

  1. 将对于区间的加减操作转化为对于端点的操作;
  2. 时间复杂度为 O(n);
  3. 用于维护区间的增减但不能维护乘除;
  4. 差分后的序列比原来的数组序列多一个数。

差分算法解题的基本思路:

  1. b[1]=a[1];
  2. 从第 2 项到 n 项,利用 b[i]=a[i]-a[i-1]b[i]=a[i]−a[i−1] 差分式;
  3. 对于区间端点操作加减;
  4. 差分还原(前缀和)。
  5. 注意是从1开始,从0开始还有讨论i=0 的情况,使用1的话 b[1]=a[1]-a[0]=a[1]-0;

递推算法的一般步骤:

首先假设有一个数组:

a[]={1 2 3 4 5 7 2}

差分后:

b[]={1 1 1 1 1 2 -5}

一般应用场景:

让你对区间 [l,r] 加减操作 N 次

如:

从第二个元素到第五个元素每个+3
从第二个元素到第四个元素每个-2
从第一个元素到第三个元素每个+1
....

这里我们先演示前三个:

对于每个 [l,r] 区间的加减操作都转化为对端点 l,r+1 的操作

从第二个元素到第五个元素每个+3:

转化为:[l]+3 并且 [r+1]-3

那么原序列变成了:

1 1 1 1 1 2 -5
1 4 1 1 1 -1 -5

然后我们按照 b[i]=b[i]+b[i-1] 复原:

1 5 6 7 8 7 2

去掉最后一项,跟原序列对比:

1 2 3 4 5 7 2
1 5 6 7 8 7 2

确实是都加上了 3。

我们继续操作:

从第二个元素到第四个元素每个-2

转化为:[l]-2 并且 [r+1]+2

那么序列变成了: 

1 4 1 1 1 -1 -5
1 2 1 1 3 -1 -5

然后我们按照b[i]=b[i]+b[i-1] 复原

1 3 4 5 8 7 2

与上次复原后对比:

1 5 6 7 8 7 2
1 3 4 5 8 7 2 

确实是按照操作执行了。

注意 Warning:

不用每次都复原,只用最后一次复原即可,这里我是演示给大家看。

我们最后直接做三次,最后还原:

从第二个元素到第五个元素每个+3
从第二个元素到第四个元素每个-2
从第一个元素到第三个元素每个+1

a[]={1 2 3 4 5 7 2}

原序列差分后:

b[]={1 1 1 1 1 2 -5}

2 号元素 + 3 
6 号元素 - 3
2 号元素 - 2
5 号元素 + 2
1 号元素 + 1 
4 号元素 - 1

差分序列变成:

2 2 1 0 3 -1 -5

复原后:

2 4 5 5 8 7 5

与原序列对比:

1 2 3 4 5 7 2
2 4 5 5 8 7 5

所以还是非常方便快捷的。

差分与前缀和是逆操作,常在一起出现,但是先做差分还是先做前缀和就是两种不同的算法,做不做另一种操作也决定了算法不同,所以大家要根据题目分析,具体学会使用。通用模板如下,

//读入原始数据 n,m,a
输入n,m

for(int i=1;i<=n;i++) {
   
    输入a[i]
}

//差分
for(int i=1;i<=n;i++)
    b[i]=a[i]-a[i-1] 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值