二维差分与二维前缀和

二维差分

二维差分是一种数据处理技术,应用于二维数组或矩阵中,用来快速计算和更新子矩阵元素的和。它是对一维差分概念的自然扩展,旨在简化对二维数据结构中特定区域元素进行加减操作的过程,同时保持较高的计算效率。通过计算原数组中相邻元素的差异,形成差分数组,从而支持对原数组中任意子矩阵元素进行快速的加法或减法操作,特别适用于需要频繁修改子区域元素值且需要频繁查询子区域和的应用场景,如动态规划问题、图像处理等。

二维差分的定义

给定一个二维数组 A[i][j],其对应的二维差分数组 D[i][j] 可以定义为:

D[i][j] = A[i][j] - A[i-1][j] - A[i][j-1] + A[i-1][j-1]

这里的差分数组 D 尺寸与原数组 A 相同,但其元素值表示了原数组中当前位置 (i, j) 与其上方、左侧和左上方相邻元素之间的数值差异。通过这样的定义,差分数组存储了原数组局部区域的“增量”信息。

二维差分的用途

主要用途在于,当我们需要对原数组 A 中某个子矩阵区域(例如,以 (i, j) 为左上角,(x, y) 为右下角的子矩阵)的所有元素同时加上或减去一个常数 d 时,使用差分数组 D 可以实现 O(1) 时间复杂度的快速更新,而无需遍历整个子矩阵。具体操作如下:

  • 对差分数组 D 中的四个角元素进行更新:

    D[i][j] += d

    D[x][j] -= d

    D[i][y] -= d

    D[x][y] += d

完成上述操作后,原数组 A 中指定子矩阵区域内所有元素的总和实际上已经增加了 d * (x - i + 1) * (y - j + 1),即完成了对子矩阵所有元素的加法操作。要还原这些变化以得到原数组 A 的实际值,通常会结合使用二维前缀和(也称为累加和矩阵),通过双重累积的方式快速计算出任意子矩阵的和。

二维前缀和

二维前缀和(又称二维累加和或二维累计和)是一种预处理技术,用于快速计算二维数组或矩阵中任意子矩阵的元素和。它通过对原矩阵进行逐行、逐列的累加,生成一个新的二维数组,其中每个元素存储了原矩阵中从原点(通常是左上角 (0, 0))到当前位置 (i, j) 的所有元素之和。有了二维前缀和矩阵,可以以常数时间复杂度 O(1) 快速求解原矩阵中任意矩形区域的元素和,极大地提高了计算效率。

二维前缀和的计算过程

假设我们有一个二维数组 A[i][j],目标是计算其对应的二维前缀和矩阵 P[i][j]。计算过程如下:

  1. 初始化前缀和矩阵 P 的第一个行和第一个列:

    P[0][0] = A[0][0];
    for (int j = 1; j < N; ++j)
        P[0][j] = P[0][j - 1] + A[0][j];  // 计算第一行的前缀和
    for (int i = 1; i < M; ++i)
        P[i][0] = P[i - 1][0] + A[i][0];  // 计算第一列的前缀和
  2. 计算剩余部分的前缀和:

    for (int i = 1; i < M; ++i)
        for (int j = 1; j < N; ++j)
            P[i][j] = P[i - 1][j] + P[i][j - 1] - P[i - 1][j - 1] + A[i][j];
二维前缀和的应用

二维前缀和主要应用于需要频繁计算二维数组或矩阵中子矩阵元素和的场景,如动态规划、图像处理、统计分析等。具体应用示例包括

  • sum = P[i2][j2] - P[i1][j2] - P[i2][j1] + P[i1][j1];

    这里通过相减操作消除了不需要计算的区域和。

  • 快速更新子矩阵:结合二维差分技术,可以在常数时间内对原矩阵中的子矩阵元素进行增减操作,并保持二维前缀和的有效性。

  • 解决特定问题:在一些基于子矩阵操作的算法中,如最大子矩阵和、连续子数组的最大和等,二维前缀和可以显著提高算法的效率。

二维差分与二维前缀和的关系

二维差分和二维前缀和是互补的概念。二维前缀和数组 S[i][j] 存储了原数组从 (1, 1) 到 (i, j) 所有元素的累计和。二者之间存在一定的互逆关系,即可以通过差分数组和前缀和数组相互转换或配合使用来高效地进行数据查询和更新。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

羊大师分析,羊奶相伴五一畅享自然时光

羊大师分析&#xff0c;羊奶相伴五一畅享自然时光 羊奶相伴&#xff0c;五一畅享自然时光&#xff0c;这是一句富有诗意和生活气息的语句。羊奶&#xff0c;作为一种营养丰富、易于消化的饮品&#xff0c;不仅为人们提供了优质的蛋白质、矿物质和维生素&#xff0c;还因其独特…

Android之Fragment简介和使用实例(1)

动态添加Fragment 上面我们已经通过XML方式成功将fragment嵌入到Activity中(这种嵌入方式我们称为静态添加)&#xff0c;但这种添加方式依然不够灵活.于是Android提供了另一种更加灵活的添加方式&#xff0c;也是我们日常开发中用的最多的一种添加方式----动态添加。 动态添加…

ASM字节码操作库---入门环境搭建

文章目录 概述环境配置demo尝鲜源码地址 概述 ASM是一个操作字节码的类库&#xff0c;提到字节码&#xff0c;很多人想到的首先是JAVA字节码。其实Kotlin,Groovy等语言也会生成字节码&#xff0c;并且和Java的字节码一样&#xff0c;都能被虚拟机识别执行&#xff0c;这就意味…

MATLAB无法识别汉字的问题解决方案

试了100种方法&#xff0c;都是不行。 期待的结果 应该是这样式的&#xff1a; feature(‘locale’) ans 包含以下字段的 struct: ctype: zh_CN.UTF-8collate: zh_CN.UTF-8time: zh_CN.UTF-8numeric: en_US_POSIX.UTF-8monetary: zh_CN.UTF-8messages: zh_CN.UTF-8encoding…

行为学学习记忆实验和抗焦虑实验两款硬件

安徽耀坤XWX-BM八臂迷宫实验&#xff08;Eight-arm Maze Test&#xff0c;RMT&#xff09;由八个完全相同的臂组成&#xff0c;这些臂从一个中央平台放射出来&#xff0c;所以又被称为放射迷宫。其基本方式是&#xff1a;训练动物受食物的驱使对迷宫的各臂进行探究&#xff0c;…

golang反射

go反射 反射基本介绍应用场景基本使用结构体注意练习最佳实践遍历结构体的方法&#xff0c;调用接头体的方法&#xff0c;获取结构体的标签 反射 基本介绍 反射可以在运行时动态获取变量的各种信息&#xff0c;比如变量的类型(type)、类别(kind)如果是结构体变量&#xff0c;…

【学习笔记二十九】EWM较特殊的业务场景

一、供应商寄售业务相关 1.创建寄售物料、寄售信息记录以及寄售的采购订单 2.创建交货单 3.维护入库交货 行项目里存在C寄售的标识 4.创建上架的仓库任务并确定 查看仓位库存&#xff0c;发现仓位库存里存在寄售标识C以及寄售库存所有方 5.寄售转自有 ①首先MIGO里进行寄…

Linux 权限与软件包管理器 yum

一. 研究Linux默认权限 目录 &#xff0c;起始权限&#xff1a;777 普通文件&#xff0c;起始权限666 Linux系统中存在权限掩码 使用umask指令也可以改变掩码 如果将掩码改为0000 我们可以看到权限发生改变&#xff08;重新设置掩码&#xff09; 最终权限起始权限 去掉 权限…

0426_C高级4

练习1&#xff1a; 输入一个数字&#xff0c;实现数字逆置&#xff08;不使用字符串截取方式&#xff09; 1 #!/bin/bash2 read -p "输入一个数字&#xff1a;" number3 p$number4 result5 while [ $p -ne 0 ]6 do7 result$((result*10p%10))8 p$((p/10))9 …

Python基础10-使用正则表达式进行文本处理

在编程过程中&#xff0c;我们经常需要对文本进行处理&#xff0c;以提取、替换或分割特定的字符串。正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本处理工具&#xff0c;它可以帮助我们实现这些任务。以下是使用正则表达式进行文本处理的一些基本方法…

react-lib 读取本地模板创建PDF

读取本地文件和读取远程的一样&#xff0c;都使用fetch去获取 async function modifyPdf() {let url ./template.pdflet existingPdfBytes await fetch(url).then(res > res.arrayBuffer()) // 这里也有问题要转一下const d new Uint8Array(existingPdfBytes)const pdfDo…

Mysql索引规范及原理分析

1 Mysql存储引擎 MySQL中的数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力&#xff0c;这些不同的技术以及配套的功能在MySQL中称为存储引擎。 存储引擎是MySQL将数据存储在文件系统中的存储方…

235 基于matlab的时频盲源分离(TFBSS)算法

基于matlab的时频盲源分离&#xff08;TFBSS&#xff09;算法&#xff0c;TFBSS用空间频率分布来分离非平稳信号&#xff0c;可以分离具有不同时频分布的源信号&#xff0c;也能够分离具有相同谱密度但时频分布不同的高斯源。同时&#xff0c;该算法在时频域上局域化源信号能量…

39岁TVB靓仔小生自曝恋情,曾沦为洗车工如今半年赚足7位数

39岁高钧贤自从2005年参加香港先生选举夺冠后&#xff0c;之后加入TVB拍摄过多套电视剧集&#xff0c;最近更有份参与《逆天奇案2》&#xff0c;日前他回到TVB电视城一厂与冯盈盈宣传剧集&#xff0c;更随即拍摄短片纪录放在网上分享&#xff0c;意外曝光TVB餐厅餐单&#xff0…

如何使用IDEA直接连接MySQL数据库

如何使用IDEA直接连接MySQL数据库 新建一个空项目打开DataBase窗口连接数据库第一次连接 需要先下载驱动上一步驱动下载太慢怎么办&#xff1f;下载好驱动后 测试连接 新建一个空项目 打开DataBase窗口 连接数据库 第一次连接 需要先下载驱动 如果这里下载的很慢 看下一步解决…

DaVinci Fusion Studio 19 for Mac/win:影视后期特效合成的巅峰之作

在影视后期制作的广袤天地里&#xff0c;一款强大的特效合成软件如同一位技艺高超的魔法师&#xff0c;能够化腐朽为神奇&#xff0c;将普通的影像素材转变为震撼人心的视觉盛宴。而DaVinci Fusion Studio 19&#xff0c;正是这样一款备受影视从业者推崇的巅峰之作。 无论是Ma…

矩阵按列相乘运算的并行化实现方法

这两天一直在琢磨如下矩阵计算问题。 已知dm矩阵X和hq矩阵Y&#xff0c;求如下矩阵&#xff1a; 其中X(:,i), Y(:,j)分别表示矩阵X, Y的第i列和第j列&#xff0c;易知Z为dh矩阵。 如果直接串行计算矩阵Z&#xff0c;两个循环共有mq&#xff0c;则会很慢&#xff0c;能不能并行化…

【b站李同学的Lee】Part 3 服务器开发 NodeJS+Gulp基础入门+实战

课程地址&#xff1a;【NodeJSGulp基础入门实战】 https://www.bilibili.com/video/BV1aE411n737/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 9 服务器端基础概念 9.1 网站的组成 9.2 Node网站服务器 9.3 IP地址 9.4 域名 9.5 端口 9…

SCSS全局配置 vue项目(二)

目录 1、先要查看node版本 2、安装对应的node-sass、sass-loader版本 2.1根据项目使用的node版本安装对应的node-sass版本 2.2根据node-sass版本选择兼容的sass-loader版本&#xff0c;不然项目无法正常运行 3、在 vue.config.js 中配置&#xff1a; 4、在组件中…

刷题训练之前缀和

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握前缀和算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…