算法笔记(二)

前缀和的概念:


   实际上是利用递归,即sum[i]=sum[i]+sum[i-1],且sum[0]=a[0];

        也就是说sum[i]存储的都是前i项的和
        这样的话,我们将计算a[i]+a[i+1]+..+a[j]转化为sum[j]-sum[i-1],时间复杂度由O(n)降低至O(1)--也就是简化为搜查操作

差分的概念

        思考这样一个问题:我该如何让数组中的数字统一减去某一固定数字x
        正常情况下我们的操作是使用循环逐项递归--但是这样的操作非常浪费时间
        我们可以这样去做--使用sum数组,并使sum[i]=sum[i]-sum[i-1],且有sum[1]=a[1];
        这样做的话,我们只需要去改动端点的数值,再利用差分数组就可以重新计算出被更改的区间的数值

对于一维数组来说:

            前缀和:sum[i]=sum[i-1]+sum[i];
            差分:D[i]=a[i]-a[i-1];

对于二维数组来说--用面积的思想来理解更加简单:

             前缀和:sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
             差分:D[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];

        实际上我们也可以这样去理解--前缀和和差分是一对互逆的操作 


        当然,上述操作完全基于我们已经知晓数组元素

      那如果我们想直接定义差分数组,我们又该怎样去做呢?

      对于一维数组来说,事情非常容易:

                将a[L]+=k,a[R+1]-=k即可

      但对于二维数组来说,就发生了一些微妙的变化:

               这次我们需要将
               a[x1][y1]+=k,
               a[x1][y2+1]-=k,
               a[x2+1][y1]-=k,
               a[x2+1][y2+1]+=k

               最后一步可以理解为经过两次差分(横向和纵向分别一次),k被减去了两次,我们需要额外加回一次k

        问题又来了--那么我们如何直接去求前缀和?

        实际上我们是根据差分来计算的--也就是说,我们需要先将差分数组还原为原数组,然后再求该数组的前缀和

             一维数组的操作较为简单,这里我们着重强调二维数组的前缀和操作--我们可以将其理解为维度操作
            第一步:计算y维度的前缀和
            第二步:计算x维度的前缀和


        现在轮到三维数组了--我们根据降次的思想来解决问题

        在三维数组中,对前缀和以及差分的定义与二维以及一维相差不大,但是我们需要考虑的变量由4个增加为8个;

        前缀和:

           sum[i][j][k]=sum[i][j][k]+sum[i-1][j][k]+sum[i][j-1][k]+sum[i][j][k-1]+sum[i-1][j-1][k]-sum[i-1][j][k-1]-sum[i][j-1][k-1]-sum[i-1][j-1][k-1]

        差分:

           sum[i][j][k]=sum[i][j][k]-sum[i-1][j][k]-sum[i][j-1][k]-sum[i][j][k-1]-sum[i-1][j-1][k]+sum[i-1][j][k-1]+sum[i][j-1][k-1]+sum[i-1][j-1][k-1]
            很容易写错,所以对于三维数组我们一般直接初始化他的差分数组
        设对某个区间进行熟知的修改,且变动的数值为d;
            可得:
            sum[x1][y1][z1]+=d;
            sum[x2+1][y1][z1]-=d;
            sum[x1][y1][z2+1]-=d;
            sum[x2+1][y1][z2+1]-=d;
            sum[x1][y2+1][z1]-=d;
            sum[x2+1][y2+1][z1]+=d;
            sum[x1][y2+1][z2+1]+=d;
            sum[x2+1][y2+1][z2+1]-=d;

你可能感兴趣的:(算法笔记,算法,笔记,数据结构)