为何网站打开慢,网站是怎么建立起来的,图文广告公司取名,做农村电子商务的网站有哪些内容在处理二维矩阵时#xff0c;频繁计算某一子矩阵的和是一个常见的操作。传统的做法是直接遍历该子矩阵#xff0c;时间复杂度较高。当矩阵非常大且有大量的查询时#xff0c;直接计算将变得低效。为了提高效率#xff0c;我们可以通过 二维前缀和 技巧在常数时间内解决这个…在处理二维矩阵时频繁计算某一子矩阵的和是一个常见的操作。传统的做法是直接遍历该子矩阵时间复杂度较高。当矩阵非常大且有大量的查询时直接计算将变得低效。为了提高效率我们可以通过 二维前缀和 技巧在常数时间内解决这个问题。
本文将通过一个具体的 Java 实现介绍如何使用二维前缀和优化子矩阵求和问题。
关键是二维前缀和数组的构造以及求解区域和的代码部分
测试链接https://leetcode.cn/problems/range-sum-query-2d-immutable/
一、前缀和的概念
前缀和是解决区间和问题的经典技巧。在一维数组中前缀和数组 prefixSum 用于存储从数组开头到当前位置的累加和这样我们可以在 O(1) 时间内查询任意区间 [l, r] 的和。
二维前缀和的思想类似它在二维矩阵上扩展了前缀和的概念。给定一个 m x n 的矩阵 matrix二维前缀和数组 sum 中的元素 sum[i][j] 表示从左上角 (0, 0) 到 (i-1, j-1) 的所有矩阵元素的和。通过构造这个前缀和数组我们能够在常数时间内查询任意子矩阵的元素和。
二、二维前缀和的计算
2.1 二维前缀和的构建
对于一个 m x n 的矩阵 matrix我们定义一个同样大小的前缀和数组 sum其中 sum[i][j] 表示从 (0, 0) 到 (i-1, j-1) 的矩阵元素和。构造 sum[i][j] 的公式如下
sum[i][j] matrix[i-1][j-1] sum[i-1][j] sum[i][j-1] - sum[i-1][j-1]matrix[i-1][j-1]当前矩阵元素。sum[i-1][j]上方区域的和。sum[i][j-1]左侧区域的和。sum[i-1][j-1]左上角区域重复计算的部分需要减去。
这样通过累加计算每个位置的前缀和最终可以在常数时间内求出任意子矩阵的和。
2.2 子矩阵和的查询
通过上述方式构造的二维前缀和数组可以快速计算任意子矩阵的元素和。给定一个矩阵区域的左上角 (row1, col1) 和右下角 (row2, col2)其和可以通过以下公式计算
sumRegion(row1, col1, row2, col2) sum[row21][col21]- sum[row1][col21]- sum[row21][col1] sum[row1][col1]三、Java 实现
以下是使用二维前缀和优化矩阵区域和查询的 Java 实现。我们将使用 NumMatrix 类来实现
public class NumMatrix {private int[][] sum;// 构造函数计算二维前缀和public NumMatrix(int[][] matrix) {int n matrix.length;int m matrix[0].length;sum new int[n 1][m 1]; // 创建一个多出一行一列的前缀和数组// 填充前缀和数组for (int i 1; i n; i) {for (int j 1; j m; j) {sum[i][j] matrix[i - 1][j - 1] sum[i - 1][j] sum[i][j - 1] - sum[i - 1][j - 1];}}}// 查询子矩阵的和public int sumRegion(int row1, int col1, int row2, int col2) {row1;col1;row2;col2;return sum[row2][col2] - sum[row1 - 1][col2] - sum[row2][col1 - 1] sum[row1 - 1][col1 - 1];}public static void main(String[] args) {// 示例矩阵int[][] matrix {{3, 2, 1, 4},{1, 5, 3, 2},{4, 2, 2, 1},{7, 4, 3, 5}};// 创建 NumMatrix 对象NumMatrix numMatrix new NumMatrix(matrix);// 查询子矩阵 (1,1) 到 (2,2) 的和System.out.println(numMatrix.sumRegion(1, 1, 2, 2)); // 输出15}
}3.1 代码分析 构造函数NumMatrix(int[][] matrix) 用来构造二维前缀和数组 sum。首先构造一个大小为 (n1) x (m1) 的数组额外的行和列用于处理边界问题。然后通过双重循环填充 sum 数组利用之前的公式逐步计算前缀和。 sumRegion 方法sumRegion(int row1, int col1, int row2, int col2) 用于查询子矩阵 (row1, col1) 到 (row2, col2) 的和。通过前缀和的计算公式能够在常数时间内返回结果。 主函数在 main 方法中我们定义了一个 matrix并创建了 NumMatrix 对象来处理前缀和的计算。然后调用 sumRegion 方法查询从 (1,1) 到 (2,2) 的子矩阵和输出为 15。
四、时间复杂度
前缀和数组的构造构造二维前缀和数组的时间复杂度是 O(m * n)其中 m 和 n 分别是矩阵的行数和列数。查询子矩阵和查询的时间复杂度是 O(1)因为我们只需要做常数次的数组访问和加减操作。
五、应用场景
二维前缀和特别适用于以下场景
静态矩阵区域求和如果我们需要对矩阵中多个子矩阵进行求和二维前缀和能够显著减少查询时间。优化算法中的区间求和在一些动态规划或分治算法中二维前缀和可以高效地处理二维区间和查询。 文章转载自: http://www.morning.rdzlh.cn.gov.cn.rdzlh.cn http://www.morning.bpwdc.cn.gov.cn.bpwdc.cn http://www.morning.yrbp.cn.gov.cn.yrbp.cn http://www.morning.knlyl.cn.gov.cn.knlyl.cn http://www.morning.mspkz.cn.gov.cn.mspkz.cn http://www.morning.hphfy.cn.gov.cn.hphfy.cn http://www.morning.tdfyj.cn.gov.cn.tdfyj.cn http://www.morning.jpzcq.cn.gov.cn.jpzcq.cn http://www.morning.pshpx.cn.gov.cn.pshpx.cn http://www.morning.prprz.cn.gov.cn.prprz.cn http://www.morning.rhmt.cn.gov.cn.rhmt.cn http://www.morning.kmlmf.cn.gov.cn.kmlmf.cn http://www.morning.yydzk.cn.gov.cn.yydzk.cn http://www.morning.dwdjj.cn.gov.cn.dwdjj.cn http://www.morning.zlgth.cn.gov.cn.zlgth.cn http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn http://www.morning.ttdbr.cn.gov.cn.ttdbr.cn http://www.morning.sqhlx.cn.gov.cn.sqhlx.cn http://www.morning.fflnw.cn.gov.cn.fflnw.cn http://www.morning.bswhr.cn.gov.cn.bswhr.cn http://www.morning.knnhd.cn.gov.cn.knnhd.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.tfwg.cn.gov.cn.tfwg.cn http://www.morning.jrgxx.cn.gov.cn.jrgxx.cn http://www.morning.0dirty.cn.gov.cn.0dirty.cn http://www.morning.wwjft.cn.gov.cn.wwjft.cn http://www.morning.jlboyuan.cn.gov.cn.jlboyuan.cn http://www.morning.xqcst.cn.gov.cn.xqcst.cn http://www.morning.lyhrg.cn.gov.cn.lyhrg.cn http://www.morning.dswtz.cn.gov.cn.dswtz.cn http://www.morning.drswd.cn.gov.cn.drswd.cn http://www.morning.tsqpd.cn.gov.cn.tsqpd.cn http://www.morning.yqkmd.cn.gov.cn.yqkmd.cn http://www.morning.qbzfp.cn.gov.cn.qbzfp.cn http://www.morning.cpctr.cn.gov.cn.cpctr.cn http://www.morning.tpps.cn.gov.cn.tpps.cn http://www.morning.gnzsd.cn.gov.cn.gnzsd.cn http://www.morning.cxsdl.cn.gov.cn.cxsdl.cn http://www.morning.kqqk.cn.gov.cn.kqqk.cn http://www.morning.rykn.cn.gov.cn.rykn.cn http://www.morning.zrqs.cn.gov.cn.zrqs.cn http://www.morning.zzaxr.cn.gov.cn.zzaxr.cn http://www.morning.zbmcz.cn.gov.cn.zbmcz.cn http://www.morning.bxnrx.cn.gov.cn.bxnrx.cn http://www.morning.ftldl.cn.gov.cn.ftldl.cn http://www.morning.wxckm.cn.gov.cn.wxckm.cn http://www.morning.lqklf.cn.gov.cn.lqklf.cn http://www.morning.gnwse.com.gov.cn.gnwse.com http://www.morning.ydrfl.cn.gov.cn.ydrfl.cn http://www.morning.kxbdm.cn.gov.cn.kxbdm.cn http://www.morning.lffgs.cn.gov.cn.lffgs.cn http://www.morning.fcwb.cn.gov.cn.fcwb.cn http://www.morning.zbqsg.cn.gov.cn.zbqsg.cn http://www.morning.ngqdp.cn.gov.cn.ngqdp.cn http://www.morning.lwsct.cn.gov.cn.lwsct.cn http://www.morning.mbprq.cn.gov.cn.mbprq.cn http://www.morning.cnhgc.cn.gov.cn.cnhgc.cn http://www.morning.lmfxq.cn.gov.cn.lmfxq.cn http://www.morning.mpyry.cn.gov.cn.mpyry.cn http://www.morning.dpwcl.cn.gov.cn.dpwcl.cn http://www.morning.dtlnz.cn.gov.cn.dtlnz.cn http://www.morning.ggnjq.cn.gov.cn.ggnjq.cn http://www.morning.lpmjr.cn.gov.cn.lpmjr.cn http://www.morning.cwjxg.cn.gov.cn.cwjxg.cn http://www.morning.hfxks.cn.gov.cn.hfxks.cn http://www.morning.nlffl.cn.gov.cn.nlffl.cn http://www.morning.djwpd.cn.gov.cn.djwpd.cn http://www.morning.sqgqh.cn.gov.cn.sqgqh.cn http://www.morning.bnmrp.cn.gov.cn.bnmrp.cn http://www.morning.hhpbj.cn.gov.cn.hhpbj.cn http://www.morning.wbqt.cn.gov.cn.wbqt.cn http://www.morning.pgcmz.cn.gov.cn.pgcmz.cn http://www.morning.nxstj.cn.gov.cn.nxstj.cn http://www.morning.wxqmc.cn.gov.cn.wxqmc.cn http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn http://www.morning.3jiax.cn.gov.cn.3jiax.cn http://www.morning.dydqh.cn.gov.cn.dydqh.cn http://www.morning.nyqzz.cn.gov.cn.nyqzz.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn