二维矩阵的元素和

news/2024/11/20 7:00:42/

二维矩阵的元素和

    • 1.背景
    • 2.原理
    • 3.实现

1.背景

对矩阵元素进行求和,或者求子矩阵的元素和;给定矩阵左上角坐标(x1,y1)和右下角坐标(x2,y2); 如何快速求出 以(x1,y1),(x2,y2)围成的矩阵的元素和?

例如:有4x4矩阵A, 求A中所有元素和; 即求以左上角[0,0], 右下角[3,3]的矩阵的元素和
在这里插入图片描述
一种方法是暴力枚举,从左至右,从上至下依次加上每个元素:

int matrixElementSum(vector<vector<int>> &matrix, int x1,int y1, int x2, int y2) {int sum = 0;for (int i = x1; i <= x2; i++ ) {	/for (int j = y1; j <= y2; j++{sum += matrix[i][j];}}return sum
}

但是,如果需要求多个子矩阵的和,需要枚举多次,有没有一种方法,以O(1)的时间复杂度求出矩阵的元素和?可以通过预处理求出每个矩阵的元素和,然后让两个矩阵相减求得任意子矩阵的元素和。

2.原理

如何求得M的元素和?求前缀和再作差
首先,将矩阵M分成4块,
A:红色矩形
B:蓝色矩形
C:绿色矩形
D:紫色矩形
在这里插入图片描述
矩阵A、B、C、D的元素和记为 Sa,Sb,Sc,Sd; 那么矩阵M中所有元素的和S可以表示为:
S = Sc+Sb-Sa+Sd;
因为B, C中均包含了A, Sa加了两次,所以是Sb+Sc-Sa, 最后加上D部分的元素和Sd, 即为S的元素和;
S的递推式可以写成
S = Sc+Sb-Sa+Sd; C的右下角坐标(i-1,j), B的右下角坐标(i,j-1), A的右下角坐标(i-1,j-1), D的坐标(i,j), S的递推式

S[i][j] =  S[i][j-1] + S[i-1][j] - S[i-1][j-1] + M[i][j]; 

举个例子:
矩阵M如下图,矩阵M的元素和S, 矩阵下标从0开始, 根据上述递推公式
S[3][3] = S[3][2] + S[2][3] - S[2][2] + M[3][3]
在这里插入图片描述
以0,0为左上角,i,j (0 <= i <= m, 0 <= j <= n) 为右下角的矩阵元素和矩阵为
在这里插入图片描述

如果要求其中任意矩阵的元素和,例如右上角(1,1),坐下角(3,3)子矩阵的元素和, 即下图中子矩阵的元素和
在这里插入图片描述
可以用整个矩阵的元素和S,减去蓝色部分子矩阵元素和,减去绿色部分子矩阵元素和,加上红色部分子矩阵元素和(因为减了两次), 于是,上一张图中的矩阵元素和为
S1 = S[3][3] - S[3]0] - S[0][3] + S[0][0]
在这里插入图片描述
记右上角(row1,col1),坐下角(row2,col2), 子矩阵元素和计算公式
S1 = S[row2][col2] - S[row2][col2] - S[row1][col2] + S[row1][col1]

3.实现

#include<iostream>
#include<vector>
#include<string.h>
#define N 101
using namespace std;int A[N][N];
int S[N][N];int main() {int n = 6;memset(A,0,sizeof(A));memset(S,0,sizeof(S));for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {A[i][j] = j+1;cout << A[i][j] << " ";}cout << endl; }cout << "---sum---" << endl;//S[i][j] = S[i-1][j]+S[i][j-1]-S[i-1][j-1]+F[i][j] //S[0][j] = S[0][j-1]+A[0][j]//S[i][0] = S[i-1][0]+A[i][0]for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i==0 && j==0) {S[i][j] = A[i][j]; } else if (i==0) {S[i][j] = S[i][j-1] + A[i][j]; 	//A[0][j], 第一行 } else if(j==0) {S[i][j] = S[i-1][j] + A[i][j];	//A[i][0], 第一列 } else {S[i][j] = S[i-1][j] + S[i][j-1] - S[i-1][j-1] + A[i][j]; }cout << S[i][j] << " ";}cout << endl;}cout << "---sub matrix sum---" << endl;//S1 = S[x2][y2] - S[x2][y1] - S[x1][y2] + S[x1][y1]int x1,x2,y1,y2;// 1 1 4 4cin >> x1 >> y1 >> x2 >> y2;int S1 = S[x2-1][y2-1] - S[x2-1][y1-1] - S[x1-1][y2-1] + S[x1-1][y1-1];cout << S1 << endl; return 0;
} 

输出:
1 2 3 4
5 6 7 8
1 2 3 4
5 6 7 8
—sum—
1 3 6 10
6 14 24 36
7 17 30 46
12 28 48 72
—sub matrix sum—
1 1 4 4
51

参考:
https://www.bilibili.com/video/BV1oz4y1S7px?spm_id_from=333.880.my_history.page.click


http://www.ppmy.cn/news/12558.html

相关文章

使用 Cloudflare Zero Trust 通过 SSH 连接到 GitHub Actions 的 Runner 机器以进行调试

GitHub Actions 的 Runner Images 包含了很多常用的开发环境, 使用它来构建一些软件是很方便的. 不过, 构建过程难免会遇到问题, 而在 GitHub Actions 上进行构建和在本地有很多不同之处. 首先 Runner 上的环境复杂, 在本地不易复现, 若是调用了一些外部 Action, 甚至是平台限…

【算法】二叉树

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录二叉树数组转化为二叉树二叉树转化为二叉链表二叉树的遍历排序二叉树BST&#xff08;二叉搜索树&…

2022年“网络安全”赛项海南省赛选拔赛 任务书

2022年“网络安全”赛项海南省赛选拔赛 任务书 一、竞赛时间 共计6小时。 &#xff08;二&#xff09;A模块基础设施设置/安全加固&#xff08;350分&#xff09; 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&#xff0c;对于企业的服务器系统&#xff0c…

转换函数和运算符类

我们以下是采用内联函数来进行的#ifndef ___Class_Counter #if 1 #endif ___Class_counter #include <climits> class Counter{unsigned cnt; // unsigned mmm; public:Counter() : cnt(0) {}//构造函数初始化器//Counter(double mmm):mmm(2){}/*void increment() {i…

软件测试复习03:动态测试——白盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录逻辑覆盖法&#xff1a;最常用程序插桩技术基本路径法点覆盖边覆盖边对覆盖主路径覆盖符号测试错误…

2023年面试题之Dubbo基础

1. 为什么要用 Dubbo&#xff1f;随着服务化的进一步发展&#xff0c;服务越来越多&#xff0c;服务之间的调用和依赖关系也越来越复杂&#xff0c;诞生了面向服务的架构体系(SOA)&#xff0c;也因此衍生出了一系列相应的技术&#xff0c;如对服务提供、服务调用、连接处理、通…

【C++】map和set的使用

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;关联式容…

Python数学建模问题总结(2)数据可视化Cookbook指南·上

概括总结&#xff1a;一、可视化问题1.不会可视化图标&#xff1b;2.可视化效果不好看&#xff1b;3.数据可视化成果无法得到很好的推广使用。二、可视化原则准确的、有帮助的、可扩展的。三、类型1.随时间变化&#xff1b;2.类别比较图表&#xff1b;3.排名列表&#xff1a;有…