在CSP - J备考的冲刺阶段,数据结构的强化是非常关键的。其中,二维前缀和是一个重要的知识点。
一、二维前缀和的构建
二维前缀和的构建公式为$s[i][j]=s[i - 1][j]+s[i][j - 1]-s[i - 1][j - 1]+a[i][j]$。这里的$a[i][j]$是原始二维数组中的元素。我们可以这样理解这个公式:
- $s[i - 1][j]$表示当前位置$(i,j)$上方所有元素的和。
- $s[i][j - 1]$表示当前位置$(i,j)$左方所有元素的和。
- 但是在计算$s[i - 1][j]+s[i][j - 1]$时,左上角的$s[i - 1][j - 1]$被重复加了一次,所以要减去$s[i - 1][j - 1]$。
- 最后再加上当前位置$(i,j)$本身的值$a[i][j]$,就得到了前缀和$s[i][j]$。
学习构建二维前缀和的方法:
- 首先要对原始的二维数组有清晰的认识,明确每个元素的含义。
- 多通过一些简单的示例进行手动计算,比如$3\times3$或者$4\times4$的二维数组,按照公式逐步计算前缀和数组,加深对公式的理解。
二、矩形区域和查询的$O(1)$时间复杂度实现
当我们构建好二维前缀和数组后,查询矩形区域的和就可以在常数时间内完成。假设我们要查询以$(x1,y1)$为左上角,$(x2,y2)$为右下角的矩形区域的和。根据前缀和的性质,这个区域的和可以表示为:$s[x2][y2]-s[x1 - 1][y2]-s[x2][y1 - 1]+s[x1 - 1][y1 - 1]$。
- 这里$s[x2][y2]$是整个大矩形(包含要查询的小矩形以及周围的区域)的前缀和。
- $s[x1 - 1][y2]$是上面多出来的部分的前缀和。
- $s[x2][y1 - 1]$是左边多出来的部分的前缀和。
- 而$s[x1 - 1][y1 - 1]$在减去上面和左边的部分时被多减了一次,所以要加回来。
要掌握这种查询方法:
- 可以通过画图的方式,直观地看到各个区域之间的关系,理解为什么是这样的计算公式。
- 进行大量的查询练习,提高计算的准确性和速度。
三、典型例题解析
例如有一道题:给定一个$5\times5$的矩阵,以及多个查询矩形区域,求每个区域的数字之和。
首先按照公式构建二维前缀和数组。假设原始矩阵为$a$,则:
- 初始化前缀和数组$s$,大小也为$5\times5$。
- 对于$i = 1$到$5$,$j = 1$到$5$,按照$s[i][j]=s[i - 1][j]+s[i][j - 1]-s[i - 1][j - 1]+a[i][j]$计算。
当查询以$(2,2)$为左上角,$(4,4)$为右下角的矩形区域时:
- 根据公式$s[4][4]-s[1][4]-s[4][1]+s[1][1]$计算得到该区域的和。
总之,在CSP - J的备考冲刺阶段,要深入理解二维前缀和的概念、构建方法以及矩形区域和查询的实现,通过大量的练习来提高对这一知识点的掌握程度。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!