锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【Y总/算法基础课/学习笔记】前缀和 及 差分 思想

时间:2023-10-02 20:07:01 sl2继电器线路板底座

目录

    • 前缀和 及 差分的思想
      • 1. 一维前缀和
      • 2. 二维前缀和
      • 3. 一维差分
      • 4. 二维差分
    • 应用:模板题

前缀和 及 差分的思想

1. 一维前缀和

  • 一维前缀和定义:从下标从『1』开始长度为『 n n n』的一维数组 『 a 1 , a 2 , a 3 , . . . , a n a_1,a_2,a_3,...,a_n a1,a2,a3,...,an』,前缀和计算公式为『 S i = a 1 a 2 . . . a i S_i=a_1 a_2 ... a_i Si=a1+a2+...+ai』。
    • 如何求解『 S i S_i Si
      S[0] = 0;
      for (int i = 1; i <= n; ++i) { 
                  
         S[i] = S[i - 1] + a[i];
      }
      
    • 作用:快速的求解原数组中任意一段 [l,r] 的和『 S = S r − S l − 1 S=S_r-S_{l-1} S=SrSl1』,计算的时间复杂度为 O ( 1 ) O(1) O(1)
    • 为什么原数组下标必须从1开始:定义『 S 0 = 0 S_0=0 S0=0』可以更好地处理边界问题,统一公式为『 S = S r − S l − 1 S=S_r-S_{l-1} S=SrSl1』。例如计算『 S 10 S_{10} S10』也可以写成『 S 10 = S 10 − S 0 S_{10}=S_{10}-S_0 S10=S10S0』。

2. 二维前缀和

  • 二维前缀和的定义:对于一个从下标从『1』开始的大小为『 n × m n \times m n×m』的二维数组 『 a i j a_{ij} aij』,前缀和的计算公式为『 S i j = a 11 + a 12 + . . . + a 1 j + a 21 + a 22 + . . . + a 2 j + . . . + a i 1 + a i 2 + . . . + a i j S_{ij}=a_{11}+a_{12}+...+a_{1j}+a_{21}+a_{22}+...+a_{2j}+...+a_{i1}+a_{i2}+...+a_{ij} Sij=a11+a12+...+a1j+a21+a22+...+a2j+...+ai1+ai2+...+aij』,即为其左上角所有元素的和。
    • 如何求解『 S i j S_{ij} Sij
      S[0][0] = 0; S[0][1] = 0; S[1][0] = 0;
      for (int i = 1; i <= n; ++i) { 
                  
      	for (int j = 1; j <= m; ++j) { 
                  
         		S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + a[i][j];
      }
      
    • 作用:快速的求解原二维数组中任意一块矩形 [ l 1 [l_1 [l1 ~ l 2 , r 1 l_2,r_1 l2,r1 ~ r 2 ] r_2] r2] l 2 > l 1 , r 2 > r 1 l_2>l_1,r_2>r_1 l2>l1,r2>r1)的和『 S = S l 2 r 2 − S ( l 1 − 1 ) r 2 − S l 2 ( r 1 − 1 ) + S ( l 1 − 1 ) ( r 1 − 1 ) S=S_{l_2r_2}-S_{(l_1-1)r_2}-S_{l_2(r_1-1)}+S_{(l_1-1)(r_1-1)} S=Sl2r2S(l11)r2Sl2(r11)+S(l11)(r11)』,计算的时间复杂度为 O ( 1 ) O(1) O(1)

3. 一维差分

相关文章