前缀和矩阵

前缀和矩阵(Prefix Sum Matrix)是一种预处理技术,用于快速计算二维矩阵中任意子矩阵的元素和。其核心思想是通过提前计算并存储每个位置左上角所有元素的和,将子矩阵和的查询时间从暴力计算的 (O(mn)) 优化到 (O(1))。以下是构建前缀和矩阵的详细步骤和示例:


文章目录

      • 1. 定义原矩阵与前缀和矩阵
      • 2. 构建前缀和矩阵的步骤
        • 步骤 1:初始化前缀和矩阵
        • 步骤 2:递推公式
      • 3. 构建示例
      • 4. 查询子矩阵和
      • 5. 代码实现(C++)
      • 关键点总结

1. 定义原矩阵与前缀和矩阵

  • 原矩阵:一个 m X n 的二维数组 matrix,元素为整数或浮点数。
  • 前缀和矩阵:一个与 matrix 同尺寸的二维数组 prefix,其中 prefix[i][j] 表示从左上角 (0,0)(i,j) 形成的子矩阵所有元素之和。

2. 构建前缀和矩阵的步骤

步骤 1:初始化前缀和矩阵
  • 创建一个与原矩阵大小相同的二维数组 prefix
  • 通常将 prefix 的索引从 (0,0) 开始(与 matrix 对齐)。
步骤 2:递推公式
  • 边界条件

    • i=0j=0 时:

      							prefix[0][0] = matrix[0][0]
      
    • i=0 时(第一行):

      					prefix[0][j] = prefix[0][j-1] + matrix[0][j]
      
    • j=0 时(第一列):

      					prefix[i][0] = prefix[i-1][0] + matrix[i][0]
      
  • 一般情况i>0j>0):

    				prefix[i][j] = matrix[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1]
    

    解释
    当前元素的值 matrix[i][j],加上上方子矩阵的和 prefix[i-1][j],加上左方子矩阵的和 prefix[i][j-1],再减去重复计算的左上角子矩阵 prefix[i-1][j-1]


3. 构建示例

假设原矩阵 matrix 如下:

                                           [1  2  3][4  5  6][7  8  9]

逐行构建前缀和矩阵 prefix

  1. 初始化 prefix[0][0]

    							prefix[0][0] = matrix[0][0] = 1
    
  2. 第一行(i=0

    					prefix[0][1] &= prefix[0][0] + matrix[0][1] = 1 + 2 = 3 prefix[0][2] &= prefix[0][1] + matrix[0][2] = 3 + 3 = 6 
    
  3. 第一列(j=0

    					prefix[1][0] &= prefix[0][0] + matrix[1][0] = 1 + 4 = 5 prefix[2][0] &= prefix[1][0] + matrix[2][0] = 5 + 7 = 12 
    
  4. 一般位置(i>0j>0

    • prefix[1][1]

      								5 + 5 + 3 - 1 = 12
      
    • prefix[1][2]

      								6 + 12 + 6 - 3 = 21
      
    • prefix[2][1]

      								8 + 12 + 12 - 5 = 27
      
    • prefix[2][2]

      								9 + 27 + 21 - 12 = 45
      

最终前缀和矩阵

                                            [1  3   6 ][5  12  21][12 27  45]

4. 查询子矩阵和

构建前缀和矩阵后,计算子矩阵 (x1, y1)(x2, y2) 的和公式为:

	Sum = prefix[x2][y2] - prefix[x1-1][y2] - prefix[x2][y1-1] + prefix[x1-1][y1-1]

示例
计算子矩阵 (1,1)(2,2)(即原矩阵中的 5,6,8,9)的和:

	Sum = 45 - 6 - 12 + 1 = 28

5. 代码实现(C++)

#include <vector>
using namespace std;vector<vector<int>> buildPrefixSum(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size();vector<vector<int>> prefix(m, vector<int>(n, 0));// 初始化第一行和第一列prefix[0][0] = matrix[0][0];for (int j = 1; j < n; j++) prefix[0][j] = prefix[0][j-1] + matrix[0][j];for (int i = 1; i < m; i++) prefix[i][0] = prefix[i-1][0] + matrix[i][0];// 填充其他位置for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {prefix[i][j] = matrix[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1];}}return prefix;
}

关键点总结

  • 时间复杂度:构建前缀和矩阵需 (O(mn)),查询子矩阵和仅需 (O(1))。
  • 适用场景:频繁查询子矩阵和的场景(如动态规划、图像处理)。
  • 边界处理:注意索引从 0 开始,避免越界访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构评估中的重要概念

(1)敏感点(Sensitivity Point) 和权衡点 (Tradeoff Point)。敏感点和权衡点是关键的架构 决策。敏感点是一个或多个构件(和/或构件之间的关系)的特性。研究敏感点可使设计人员 或分析员明确在搞清楚如何实现质量目标时应注意什么。权衡点是影响多个质量属性的特性&#xff0c; …

SSL证书和HTTPS:全面解析它们的功能与重要性

每当我们在互联网上输入个人信息、进行在线交易时&#xff0c;背后是否有一个安全的保障&#xff1f;这时&#xff0c;SSL证书和HTTPS便扮演了至关重要的角色。本文将全面分析SSL证书和HTTPS的含义、功能、重要性以及它们在网络安全中的作用。 一、SSL证书的定义与基本概念 S…

基于微信小程序的停车场管理系统的设计与实现

第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展&#xff0c;各行各业都在摸索移动互联对本行业的改变&#xff0c;不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件&#xff0c;但是APP作为一个只为某个公司服务的一个软件&a…

宝塔找不到php扩展swoole,服务器编译安装

1. 在php7.4中安装swoole&#xff0c;但找不到这个扩展安装 2. 服务器下载源码解压安装 http://pecl.php.net/package/swoole 下载4.8.0版本 解压到/www/server/php/74/下 3. 发现报错问题&#xff1b; 更新一下依赖 yum update yum -y install gcc gcc-c autoconf libjpe…

大数据测试总结

总结测试要点&#xff1a; 参考产品文档&#xff0c;技术文档梳理以下内容 需求来源 业务方应用场景 数据源&#xff0c;数据格转&#xff0c;数据产出&#xff0c;数据呈现方式&#xff08;数据消亡史&#xff09;&#xff0c;数据量级&#xff08;增量&#xff0c;全量&am…

React封装通用Table组件,支持搜索(多条件)、筛选、自动序号、数据量统计等功能。未采用二次封装调整灵活,包含使用文档

封装通用组件 一、封装思想二、react代码三、css代码四、实现效果五、使用文档 BasicTableModal 表格模态框组件1.组件简介2.功能特点3.使用方法基础用法宽度控制示例带筛选功能搜索功能示例自定义单元格渲染 4.API 说明PropsColumn 配置项Filter 配置项 5.注意事项 一、封装思…

React 中 useState 的 基础使用

概念&#xff1a;useState 是一个React Hook&#xff08;函数&#xff09;&#xff0c;它允许我们向组件添加状态变量&#xff0c;从而影响组件的渲染结果。 本质&#xff1a;和普通JS变量不同的是&#xff0c;状态变量一旦发生变化&#xff0c;组件的视图UI也会跟着变化&…

Html5学习教程,从入门到精通,HTML `<div>` 和 `<span>` 标签:语法知识点与案例代码(12)

HTML <div> 和 <span> 标签&#xff1a;语法知识点与案例代码 一、语法知识点 1. <div> 标签 定义: <div> 是一个块级元素&#xff0c;用于将文档内容划分为独立的、可样式化的部分。它本身没有特定的语义&#xff0c;主要用于布局和分组。特点: 块…

Hbase伪分布安装教程,详细版

注意Hbase版本与Hadoop版本的兼容&#xff0c;还有与JDK版本的兼容 本次用到的Hbase为2.4.6版本&#xff0c;Hadoop为3.1.3版本&#xff0c;JDK为JDK8 打开下面的网址查看兼容问题 Apache HBase Reference Guidehttps://hbase.apache.org/book.html#configuration 点击基础先…

Python项目】基于Python的图像去雾算法研究和系统实现

Python项目】基于Python的图像去雾算法研究和系统实现 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;图像去雾系统主要是基于暗通道先验和逆深度估计技术的去雾算法&#xff0c;系统功能模块分为&#xff08;1&#xff09;图像上传模块&…

Stable Diffusion Prompt编写规范详解

Stable Diffusion Prompt编写规范详解 一、语法结构规范 &#xff08;一&#xff09;基础模板框架 [质量强化] [主体特征] [环境氛围] [风格控制] [镜头参数]质量强化&#xff1a;best quality, ultra detailed, 8k resolution‌主体特征&#xff1a;(1girl:1.3), long …

勿以危小而为之勿以避率而不为

《故事汇之&#xff1a;所见/所闻/所历/所想》&#xff1a;《公园散步与小雨遇记》&#xff08;二&#xff09; 就差一点到山顶了&#xff0c;路上碰到一阿姨&#xff0c;她说等会儿要下大雨了&#xff0c;让我不要往上走了&#xff0c;我犹豫了一会儿&#xff0c;还是听劝地返…

wheel_legged_genesis 开源项目复现与问题记录

Reinforcement learning of wheel-legged robots based on Genesis System Requirements Ubuntu 20.04/22.04/24.04 python > 3.10 开始配置环境&#xff01; 点击releases后进入&#xff0c;下载对应最新版本的代码&#xff1a; 将下载后的代码包解压到你的自定义路径下&…

Gin框架从入门到实战:核心用法与最佳实践

为什么选择Gin框架&#xff1f; Gin 是一个基于 Go 语言的高性能 Web 框架&#xff0c;具备以下优势&#xff1a; 轻量高效&#xff1a;底层依赖 net/http&#xff0c;性能接近原生。简洁优雅&#xff1a;API 设计友好&#xff0c;支持路由分组、中间件链、参数绑定等特性。生…

Leetcode 3468. Find the Number of Copy Arrays

Leetcode 3468. Find the Number of Copy Arrays 1. 解题思路2. 代码实现 题目链接&#xff1a;3468. Find the Number of Copy Arrays 1. 解题思路 这一题的话思路上就是一个范围考察&#xff0c;显然&#xff0c;对于指定的copy方式&#xff0c;只要我们确定了第一个元素&…

VirtualBox虚拟机MacOS从Big Sur升级到Sequoia(失败)

VirtualBox虚拟机里安装好Big Sur版本&#xff0c;尝试升级到Sequoia&#xff0c;但是最终失败了。 软件升级 直接在系统偏好-软件更新里可以看到提示&#xff0c;提示可以升级到15版本Sequoia 点击同意&#xff0c;看能不能升级到Sequoia吧。升级前先用时光做了备份。 升级…

[杂学笔记]HTTP1.0和HTTP1.1区别、socket系列接口与TCP协议、传输长数据的时候考虑网络问题、慢查询如何优化、C++的垃圾回收机制

目录 1.HTTP1.0和HTTP1.1区别 2.socket系列接口与TCP协议 3.传输长数据的时候考虑网络问题 4.慢查询如何优化 5.C的垃圾回收机制 1.HTTP1.0和HTTP1.1区别 在连接方式上&#xff0c;HTTP1.0默认采用的是短链接的方式&#xff0c;就建立一次通信&#xff0c;也就是说即使在…

ANI AGI ASI的区别

‌‌ANI、‌AGI、‌ASI的区别主要体现在定义、特点和应用场景上‌&#xff1a; 1. ANI&#xff08;狭义人工智能 Artificial narrow intelligence&#xff09;‌&#xff1a; ‌定义‌&#xff1a;ANI&#xff0c;也被称为弱人工智能&#xff0c;是指专门设计用于执行特定任务…

用OpenCV写个视频播放器可还行?(Python版)

引言 提到OpenCV&#xff0c;大家首先想到的可能是图像处理、目标检测&#xff0c;但你是否想过——用OpenCV实现一个带进度条、倍速播放、暂停功能的视频播放器&#xff1f;本文将通过一个实战项目&#xff0c;带你深入掌握OpenCV的视频处理能力&#xff0c;并解锁以下功能&a…

leetcode日记(77)子集Ⅱ

不知道为什么看到这道题就很头痛…… 其实只要掌握nums不包含重复元素的情况下的代码就行了。 若nums不能包含重复元素&#xff0c;那么使用回溯很容易就能写出来&#xff1a; class Solution {void hs(vector<int> v,int x,vector<int> r,vector<vector<…