1、引入
定义:设初始数组为a[][],差分数组为p[][]
有:b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]
2、例子
a[][]:
1 2 4 3
5 1 2 4
6 3 5 9
根据公式,求得a数组对应的差分数组为:
1 1 2 -1
4 -5 -1 3
1 1 1 2
3、差分数组的求解方法:
方法一:根据定义直接进行求解
//求出差分数组 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]; }
方法二:由方法一衍生而来
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { cin>>a[i][j]; insert(i,j,i,j,a[i][j]); //构造二维差分数组 }
void insert(int x1,int y1,int x2,int y2,int c) { b[x1][y1]+=c; b[x1][y2+1]-=c; b[x2+1][y1]-=c; b[x1+1][y+1]+=c; }
此处方法2确实比较难理解,我们可以通过举例子来理解,首先原始数组如下:
差分数组的初始情况如下:
可以根据原始数组,根据代码得到如下差分数组:
1图:
由定义得知:b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1],根据以上4行代码:
b[1][1]=0+1=1 b[1][2]=0-1=-1 b[2][1]=0-1=-1 b[2][2]=0+1=1
2图:
我们发现,本来b[1][2]=a[1][2]-a[1][1]-a[0][2]+a[0][0]的,但是通过1图的步骤,我们事先让b[1][2]的值已经更新为了-1,所以就相当于此时b[1][2]的值就是-a[1][1]的值,只需要将a[1][2]的值也就是2加上b[1][2]原来的值即可,得到b[1][2]=-1+2=1,根据b[1][3]-=2,得到b[1][3]=-2 根据b[2][3]+=2,得到b[2][3]=2,咱们再来看b[2][2],本来b[2][2]=a[2][2]-a[2][1][-a[1][2]+a[1][1],在b[2][2]格子中,已经b[1][1]计算中得到了a[1][1]=1,此时再将-a[1][2]中的值往b[2][2]中累加,得到b[2][2]=-1。
3图:
根据核心的四行代码求得b[1][3]的值为1,b[1][4]的值本来为0,先让其加上-3,因为之后算b[1][4]的时候,可以直接用a[1][4]的值加上b[1][4],此时b[1][4]的值为-3,即-a[1][3]=-3。之后当计算遍历到b[1][4]的时候,它的值会更新
4图:
根据四行核心代码,求得b[1][4]的值为1,原来b[1][4]的值为-3,相当于-a[1][3],根据b[1][4]=a[1][4]-a[0][4]-a[1][3]+a[0][3],求得b[1][4]=-3+4=1
根据四行核心代码,求得b[2][1]的值为4,原来b[2][1]的值为-1,相当于-a[1][1],根据b[2][1]=a[2][1]-a[1][1]-a[2][0]+a[1][0],求得b[2][1]=-1+5=4,b[2][2]此时的值为1-2-5=-6,刚好等价于-a[2][1]-a[1][2]+a[1][1]=-2-5+1=-6
之后接着算b[2][2],b[2][3],b[2][4]以此类推,最终能够将差分数组b求得,如下:
4、总结
各位小伙伴们,今天的知识点讲解就到这里啦,如果对上述解释有什么疑问,或者想要相关资料可以添加微信:
二维差分数组的求解
最新推荐文章于 2024-04-12 15:33:38 发布