0
点赞
收藏
分享

微信扫一扫

前缀和与差分

jjt二向箔 2022-01-09 阅读 68
算法c++

目录

1.前缀和

1.1前缀和

1.2一维前缀和求法

1.3一维前缀和的便利之处

1.4二维前缀和

1.5二维前缀和求法

1.6二维前缀和的便利之处

2.差分

2.1差分数组

2.2差分数组的应用

2.3二维差分


1.前缀和

1.1前缀和

前缀和表示一个序列的前n项和,理解为数组的话就是从下标为1到n(定义成数组时就从下标为1开始接收该序列),而差分就是前缀和的逆运算,前缀和与差分数组是对应关系。例如数组a的前缀和为数组b,则b的差分数组为数组a。

1.2一维前缀和求法

定于数组a和b,输入a之后,对于前缀和数组b可以有以下循环得到

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

1.3一维前缀和的便利之处

用于求数组a某个区间(例如n1到n2)的和,利用前缀和数组b,直接相减(b[n2]-b[n1-1])即可得到。普通的方法可能就是从n1循环到n2,将数组a的值累加,每一次不同的区间都需要循环,时间复杂度高。

1.4二维前缀和

与一维前缀和类似,一维前缀和可以用一维数组理解,同理二维前缀和可以用二维数组(也就是矩阵)理解

1.5二维前缀和求法

for(int i=1;i<=n;i++)
{
  for(int j=1;j<=m;j++)
  {
    b[i][j]=b[i-1][j]+b[i][j-1]+a[i][j]+b[i-1][j-1];
  }
}

1.6二维前缀和的便利之处

可以求以(n1,m1)为左上角,(n2,m2)为右下角的矩阵和s。

int s=0;
s=b[n2][m2]-b[n1-1][m2]-b[n2][m1-1]+b[n1-1][m1-1];//b[n1-1][m1-1]被减去了两次,所以再加上

2.差分

差分可以理解为前缀和的逆运算

2.1差分数组

比如数组a和数组b,数组b是a的前缀和数组,即有a[i]=b[i]-b[i-1]。

2.2差分数组的应用

对前缀和数组某个区间(n1,n2)的每一个数加上1,可以对差分数组n1处加1,n2-1处减1。即a[n1]+1,a[n2]-1。

2.3二维差分

以(n1,m1)为左上角,(n2,m2)为右下角的矩阵都加上1,与一维差分类似。对差分数组(n1,m1)处加1,(n2+1,m1)处减1,(n1,m2+1)处减1,(n2+1,m2+1)处加1。(可以画个矩阵,将不同的区间分开单独看,就可以便于理解)

举报

相关推荐

0 条评论