二维前缀和与差分

前言

延续前面所讲的一维前缀和以及差分,现在来写写二维前缀和与差分

主要这个画图就比前面的一维前缀和与差分复杂一点,不过大体思路是一样的

一维和二维的主要思路在于一维是只针对对一行一列,而二维是针对与一个矩阵的

好吧,开始讲解

二维前缀和

问题描述

有一个二维数组,int arr[i][j]中从{x1,y1}->{x2,y2}的范围内求和

这里的范围是一个矩形而不是一个路径

举例 ,比如 下面对于一个三行五列的二维数组 求{1,1}->{2,2}的和就是求红色部分的和

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

暴力思路

那就是根据下表依次相加复杂度为o((x2-x1)*(y2-y1))

其实就是行乘列,这里的暴力代码实在是太简单了,但是不能太懒,还是给大家敲

#define col 5
#define line 3
int main()
{
	int arr[line][col] = {
	{1,2,3,4,5},
	{6,7,8,9,10},
	{11,12,13,14,15}
	};
	printf("请输入4个数表示两个坐标\n");
	int x1, y1, x2, y2;
	int sum = 0;
	scanf("%d %d %d %d", &x1,&y1,&x2,&y2);
	for (int i = x1; i<= x2; i++)
		for (int j = y1; j<= y2; j++)
		sum += arr[i][j];
	printf("%d", sum);
	return 0;
}

这里的时间复杂度是平方级别的

二维前缀和的思路

1.二维前缀数组的构建

这玩意用文字讲,费时间呢,还是画图来讲解吧

我们这里先把它的代码给出

void pre_sum(int arr[][col])
{
	sum[0][0] = arr[0][0];
	for (int i = 1; i < col; i++)sum[0][i] = sum[0][i - 1] + arr[0][i];
	for (int j = 1; j < line;j++)sum[j][0] = sum[j - 1][0] + arr[j][0];
	for (int i = 1; i < line; i++)
	{
		for (int j = 1; j < col; j++)
		{
			sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1]+arr[i][j];
		}
	}
}

2前缀和数组的使用

还是看图吧

OK

我们来看代码吧

//二维前缀和
#define line 3
#define col 5
int sum[line][col];
void pre_sum(int arr[][col])
{
	sum[0][0] = arr[0][0];
	for (int i = 1; i < col; i++)sum[0][i] = sum[0][i - 1] + arr[0][i];
	for (int j = 1; j < line;j++)sum[j][0] = sum[j - 1][0] + arr[j][0];
	for (int i = 1; i < line; i++)
	{
		for (int j = 1; j < col; j++)
		{
			sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1]+arr[i][j];
		}
	}
}
int result(int x1, int y1, int x2, int y2)
{
	if (x1 == 0 && y1 == 0)
		return sum[x2][y2];
	else if (x1 == 0)return sum[x2][y2] - sum[x2][y1 - 1];
	else if (y1 == 0)return sum[x2][y2] - sum[x1 - 1][y2];
	else return sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1 - 1][y1 - 1];
}
int main()
{
	int arr[line][col] = {
	{1, 2, 3, 4, 5},
	{6, 7, 8, 9, 10},
	{11,12,13,14,15}
	};
	pre_sum(arr);
	printf("%d", result(1, 0, 2, 2));
}

那么接下来看差分了

二维差分

理解了二为前缀和,那么二维差分就很简单了,同样也是一个矩阵作为作用的对象

问题描述

有一个二维数组,int arr[i][j]中从{x1,y1}->{x2,y2}的范围内求和

这里的范围是一个矩形而不是一个路径

举例 ,比如 下面对于一个三行五列的二维数组 求{1,1}->{2,2}对他们加上某个数

假设这个数为1

1 1 1 1 1       那么结果是 1 1 1 1 1

1 1 1 1 1                          1 2 2 1 1 

1 1 1 1 1                          1 2 2 1 1

暴力思路

其实真的有点不想写了,哎呦!!!!!!

还是再来吧!!!!!!

看代码

#define col 5
#define line 3
int main()
{
	int arr[line][col] = {
	{1,2,3,4,5},
	{6,7,8,9,10},
	{11,12,13,14,15}
	};
	printf("请输入4个数表示两个坐标\n");
	int x1, y1, x2, y2,val;
	scanf("%d %d %d %d", &x1,&y1,&x2,&y2);
    printf("再输入一个数作为操作数");
    scanf("%d",&val);
	for (int i = x1; i<= x2; i++)
		for (int j = y1; j<= y2; j++)
		arr[i][j]+=val;
	printf("%d", sum);
	return 0;
}

差分思路

其实这里用不到差分数组,只是把一个比原来二维数组行列都大1的一个数组全部初始化为0

然后,作为一个影响,去进行前缀和,把产生的影响加到原有的数组中

看图吧

思路上与前缀和差不多,我们主要讲如何使用

假设有两个坐标(x1,y1),(x2,y2)

构建一个二维数组,元素全部为0  d[line+1][col+1];

其实核心的代码为

d[x1][y1] += value;产生影响
d[x2 + 1][y1] -= value;让后面的元素不受影响
d[x1][y2 + 1] -= value;让后面的元素不受影响
d[x2 + 1][y2 + 1] += value;让后面的元素不受影响,多减去了

看图

看代码呗

#define line 3
#define col 5
int d[line + 1][col + 1] = {0};
void pre_d(int arr[][col])
{
	for (int i = 1; i <=col; i++)d[0][i]+=d[0][i-1];
	for (int j = 1; j <=line;j++)d[j][0]+=d[j-1][0];
	for (int i = 1; i <=line; i++)
	{
		for (int j = 1; j <=col; j++)
		{
			d[i][j]+=d[i][j-1]+d[i-1][j]-d[i-1][j-1];
		}
	}
	for (int i = 0; i < line; i++)
	{
		for (int j = 0; j < col; j++)
		{
			arr[i][j] += d[i][j];
		}
	}
}
void fun(int x1, int y1, int x2, int y2,int value)
{
	d[x1][y1] += value;
	d[x2 + 1][y1] -= value;
	d[x1][y2 + 1] -= value;
	d[x2 + 1][y2 + 1] += value;
}
void printf_a(int arr[][col])
{
	for (int i =0; i < line; i++)
	{
		for (int j = 0; j < col; j++)
		printf("%d ", arr[i][j]);
		printf("\n");
	}
}
void printf_d()
{
	for (int i = 0; i <=line; i++)
	{
		for (int j = 0; j<=col;j++)
		printf("%d ", d[i][j]);
		printf("\n");
	}
}
int main()
{
	int arr[line][col] = {
	{1, 2, 3, 4, 5},
	{6, 7, 8, 9, 10},
	{11,12,13,14,15}
	};
	fun(0, 0, 2, 1,-1);
	fun(0, 2, 2, 4, 5);
	pre_d(arr);
	printf("\n");
	printf_a(arr);
}

总结

最后,如果大家感兴趣的话可以试试三维数组

好吧,就这样吧,睡个好觉,祝大家开心啊!

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

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

相关文章

OpenStack 常见模块详解

目录 一、OpenStack 架构 二、控制台 Dashboard 三、身份认证服务 Keystone 1&#xff09;用户&#xff08;user&#xff09; 2&#xff09;项目&#xff08;project&#xff09; 3&#xff09;角色&#xff08;role&#xff09; 4&#xff09;服务&#xff08;serv…

JavaCard学习笔记: CAP Component 之 Class Component

文章目录 整体结构tag和size字段signature_pool_length和signature_pooltype_descriptor结构导入类型编码导入项签名示例导入类导入数组导入远程方法 interfaces[]interface_info结构flagsinteface_countsuperinterfacesinterface_name class_info_compact classes[]结构flagsi…

wasm 系列之 WebAssembly 和 emscripten 暴力上手

wasm 是什么&#xff1f; wasm 是 WebAssembly 的缩写。wasm 不是传统意义上的汇编语言&#xff0c;而是一种编译的中间字节码&#xff0c;可以在浏览器和其他 wasm runtime 上运行非 JavaScript 类型的语言&#xff0c;只要能被编译成 wasm&#xff0c;譬如 kotlin/wasm、Rus…

Linux嵌入式驱动开发-阻塞IO与非阻塞IO

文章目录 阻塞与非阻塞访问简介阻塞访问的实现等待队列等待队列头等待队列项从等待队列头添加/移除等待队列项等待唤醒等待事件API 非阻塞访问的实现轮询poll 函数原型可以返回的资源状态 阻塞与非阻塞访问简介 **IO&#xff1a;**Input/Output&#xff0c;也就是输入/输出&am…

2024mac苹果电脑如何清理磁盘空间?用什么软件最好

苹果电脑已成为我们日常生活和工作不可或缺的一部分。随着时间的推移&#xff0c;不论是办公文档、个人照片还是各式各样的应用程序&#xff0c;都会逐渐积累&#xff0c;导致电脑的磁盘空间日益紧张。对于用户来说&#xff0c;苹果电脑如何清理磁盘空间&#xff0c;以保持设备…

iOS 全平台矢量动画库:体积小巧、功能丰富 | 开源日报 No.227

airbnb/lottie-ios Stars: 24k License: NOASSERTION lottie-ios 是一个用于在 iOS 平台上本地渲染 After Effects 矢量动画的库。 该项目主要功能、关键特性、核心优势包括&#xff1a; 跨平台支持&#xff1a;可在 iOS, macOS, tvOS, visionOS, Android 和 Web 上使用实时渲…

07节-51单片机-矩阵键盘

文章目录 1矩阵键盘原理2.扫描的概念3.弱上拉4.实战-实现矩阵键盘对应按钮按下显示对应值4.1配置代码模板 5.键盘锁 1矩阵键盘原理 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”&#xff0c;就可以读…

前程贷v6.5系统测试报告

1.引言部分 1&#xff0e;1 项目背景 本测试报告的具体编写目的&#xff0c;指出预期的读者范围。(3-4句) 项目描述 &#xff08;项目内容&#xff0c;用户需求&#xff09; 本测试报告为**&#xff08;系统名称&#xff09;**系统测试报告&#xff1b;本报告目的在于总结测试…

【JavaEE初阶系列】——数据链路层以太网以及Mac地址

目录 &#x1f6a9;认识以太网 &#x1f6a9;以太网帧格式 &#x1f6a9;IP地址和Mac地址各自的用途 &#x1f6a9;认识以太网 "以太网"不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内…

在ios设备上运行Unity Profiler

久违了朋友们。 最近基于Unity 2021.3 和AR Foundation开发了个应用&#xff0c;需要在ipad上实际运行时查看程序的各项指标功耗。 于是乎&#xff0c;我尝试跟随者官方教程来实时调试&#xff0c;现在附上一些心得。 按照官方的三步走&#xff0c;Build and Run理论上会自动…

SSH远程连接服务实战

题目&#xff1a; 一.配置两台主机 主机1、 主机名: server.example.com ip: 192.168.78.129 建立用户timinglee&#xff0c;其密码为timinglee 主机2、 主机名&#xff1a;client.example.com ip: 192.168.78.128 2.安需求完成项目 192.168.78.128 在远程登录192.168.78.129的…

MySQL处理并发访问和高负载的关键技术和策略

大家好&#xff0c;我是咕噜铁蛋。今天&#xff0c;我想和大家聊聊MySQL处理并发访问和高负载的关键技术和策略。在当今这个数据爆炸的时代&#xff0c;数据库作为数据存储和处理的核心&#xff0c;其性能的稳定性和高效性显得尤为重要。MySQL作为广泛使用的关系型数据库管理系…

【语音识别】在Win11使用Docker部署FunASR服务器

文章目录 在 Win11 使用 Docker 部署 FunASR 服务器镜像启动服务端启动监控服务端日志下载测试案例使用测试案例打开基于 HTML 的案例连接ASR服务端 关闭FunASR服务 在 Win11 使用 Docker 部署 FunASR 服务器 该文章因官网文档不详细故写的经验论 官网文章&#xff1a;https:/…

安装多个MySQL版本时如何连接到不同的数据库

当安装多个版本的数据库时&#xff0c;不同版本的端口名不一样&#xff0c;可以使用以下命令进行连接 mysql -uroot -p数据库密码 -h主机名 -P端口号 数据库主机名默认是localhost&#xff0c;端口号默认是3306&#xff0c;当安装多个版本数据库时&#xff0c;需要记住数据库的…

Prompt-to-Prompt Image Editing with Cross Attention Control

Prompt-to-Prompt Image Editing with Cross Attention Control TL; DR&#xff1a;prompt2prompt 提出通过替换 UNet 中的交叉注意力图&#xff0c;在图像编辑过程中根据新的 prompt 语义生图的同时&#xff0c;保持图像整体布局结构不变。从而实现了基于纯文本&#xff08;不…

2024HW --->蓝队面试题

这段时间在写横向移动&#xff0c;搞得鸽了很久&#xff08;内网真的很玄学&#xff09; 还没写完。。。 但是这不是准备HW了吗。小编也来整理一下自己收集到的题目吧&#xff01;&#xff01;&#xff01; &#xff08;仅为个人见解&#xff0c;不代表最终答案&#xff09;&…

select实现echo服务器的并发

select实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/select.h> #include <sys/time.h…

Nodejs - 异步I/O

异步I/O 利用单线程&#xff0c;远离多线程死锁&#xff0c;状态同步等问题&#xff0c;利用异步I/O&#xff0c; 让单线程原理阻塞&#xff0c;更好的使用cpu异步I/O实现现状 阻塞IO 操作系统内对于I/O只有两种方式: 阻塞和非阻塞。在调用阻塞I/O的时候&#xff0c;应用程序需…

无损以太网的ROCE革命,队列的缓存空间优化分析

ROCE无损以太网&#xff0c;队列的缓存空间优化 多级缓存架构优化芯片性能&#xff1a;* 缓存空间细分为芯片级、端口级和队列级&#xff0c;实现精细管理。* 无损队列引入Headroom缓存空间&#xff0c;确保数据完整性。 在芯片层面&#xff1a; 静态缓存为端口提供保证的缓存空…

Tomcat弱口令及war包漏洞复现(保姆级教程)

1.环境搭建 靶机&#xff1a;Ubuntu 安装参考&#xff1a;安装Ubuntu详细教程_乌班图安装教程-CSDN博客 vulhub docker搭建tomcat漏洞环境 参考&#xff1a;vulhub docker靶场搭建-CSDN博客 工具&#xff1a;burpsuite 2.漏洞复现 2.1弱口令爆破 进入http://192.168.143…