差分与前缀和

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

差分法

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

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

差分法的特点:

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

差分算法解题的基本思路:b[i]=a[i]-a[i-1],a[0]=0

  •  b[1]=a[1];
  • 从第 2 项到 n 项,利用 b[i]=a[i]-a[i-1]差分式;
  •  对于区间端点操作加减
  • 差分还原(前缀和)。
  • 注意是从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 ,即第2个+3;第5+1个元素-3 

b[]是由a[]根据公式 d[i]=a[i]-a[i-1] ,a[0]= 0 .构造的新数列(差分数列)
b[]:1  1  1  1  1  2 -5 
 现: 1  4  1  1  1 -1 -5 (操作1)

(复原操作)

然后按照 d和a数列的关系,a[i]=a[i-1]+d[i],a[i]=d[1]+d[2]+....+d[i]可以得出改变后的a: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) ,即第2个-2;第4+1个元素+2

操作1: 1 4 1 1 1 -1 -5 
  现 : 1 2 1 1 3 -1 -5 

然后根据上次

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值