区间信息维护与查询【树状数组 】 - 原理2 多维树状数组

news2025/2/25 18:39:23

区间信息维护与查询【树状数组 】 - 原理2 多维树状数组

我们已经知道一维树状数组修改和查询的时间复杂度均为O (logn),可以扩展为m 维树状数组,其时间复杂度为O (log ^m n ),对该算法只需加上一层循环即可。二维数组a [n ][n ]、树状数组c [][]的查询和修改方法如下。

【1】查询前缀和

二维数组的前缀和实际上是从数组左上角到当前位置(x , y )矩阵的区间和,在一维数组查询前缀和的代码中加上一层循环即可。

算法代码:

int sum(int x, int y){ //求左上角(1, 1) 到右下角(x , y) 矩阵区间和
	
	int s = 0;
	for(int i = x; i > 0 ; i -= lowbit(i)){
		
		for(int j = y ; j > 0 ; j -= lowbit(j)){
			s += c[i][j];
		}
	}
	return s;
}

【2】更新

若对a [x ][y ]进行修改(加上z ),则在一维数组更新的代码中加上一层循环即可。

算法代码:

void add(int x , int y , int z){ // a[x][y] 加上z
	for(int i = x ; i <= n; i += lowbit(i)){
		for(int j = y ; j <= n; j += lowbit(j)){
			c[i][j] += z;
		}
	}
}

【3】 查询区间和值。

对二维数组查询区间和,实际上是求从左上角(x 1 , y 1 )到右下角(x 2 , y 2 )子矩阵的区间和。先求出左上角(1,1)到右下角(x 2 , y 2 )的区间和sum(x 2 , y 2 ),然后减去(1, 1)到(-1, y 2 )的区间和sum(x 1 -1, y 2 ),再减去(1, 1)到(x 2 , y 1 -1)的区间和sum(x 2 , y 1 -1),因为这两个矩阵的交叉区域多减了一次,所以再加回来,加上(1, 1)到(x 1 -1, y 1 -1)的区间和sum(x 1 -1, y 1 -1)。

在这里插入图片描述

算法代码:

int sum(int x1 ,int y1, int x2, int y2){ //求左上角 (x1, y1) 到右下角(x2 , y2) 子矩阵的区间和
	return sum(x2 , y2) - sum(x1 - 1 , y2) - sum(x2 , y1 - 1) + sum(x1 - 1 , y1 - 1);
}

④ 树状数组的局限性

树状数组主要用于查询前缀和、区间和及点更新,对点查询、区间修改效率较低。

前缀和查询: 求a [1]…a [i ]的前缀和,普通数组需要O (n )时间,树状数组需要O (logn )时间。

区间和查询: 求a [i ]…a [j ]的区间和,普通数组需要O (n )时间,树状数组需要O (logn )时间。

点更新: 修改a [i ]加上z ,普通数组需要O (1)时间,树状数组需要O (logn )时间。

点查询: 查找第i 个元素,普通数组需要 O (1)时间,树状数组需要O (logn )时间(求sum[i ]-sum[i -1])。

区间修改: 若对一个区间a [i ]…a [j ]的所有元素都加上z ,则普通数组需要O (n )时间,树状数组不能有效操作,只能一个一个地修改和更新,需要O (n logn )时间。

减法规则: 当问题满足减法规则时,例如求区间和a [i ]…a [j],则sum(i , j )=sum[j ]-sum[i -1]。当问题不满足减法规则时,例如求区间a [i ]…a [j ]的最大值,则不可以用a [1]…a [j ]的最大值减去a [1]…a [i -1]的最大值,此时可以用线段树解决。

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

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

相关文章

创建TCP通信与粘包问题解决

创建TCP通信 nodeJS的Net模块实现了底层通信接口 通信过程 创建服务端&#xff1a;接收和回写客户端数据创建客户端&#xff1a;发送和接收服务端数据数据传输&#xff1a; 内置服务事件和方法读写数据 通信事件 listing事件&#xff1a;调用server.listen方法之后触发con…

介绍 10 个有用的 Flutter 软件包

介绍 10 个有用的 Flutter 软件包 原文 https://genotechies.medium.com/introducing-10-useful-flutter-packages-1252c4b75fa7 前言 FLutter 软件包使您的开发简单快速。然而&#xff0c;有利有弊。有时候&#xff0c;如果从头开始开发这个特性将是有益的&#xff0c;因为可定…

Hive日分区表如何快速导入到StarRocks

1、背景 业务现状&#xff1a;集团使用FineBI做数据呈现及报表分析工具&#xff0c;经过近两年的BI建设&#xff0c;供应链域及营销域的BI建设已初具规模并体系化。数仓规模60TB&#xff0c;FineBI数据集约8000个&#xff0c;BI挂出报表数约1600个&#xff0c;报表月增幅在40左…

非凡社群管理之社群管理有什么内容

社群作为一个非常重要的私域流量池&#xff0c;它本身就是一个提升用户价值的利器。但如果管理不好社群&#xff0c;那么也是无济于事的。 社群小助手提示&#xff1a;高效管理社群&#xff0c;以下这五个方面要做好。 一&#xff0c;社群为用户解决问题&#xff0c;让群成员都…

iwebsec靶场 SQL注入漏洞通关笔记6- 宽字节注入

系列文章目录 iwebsec靶场 SQL注入漏洞通关笔记1- 数字型注入_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2- 字符型注入&#xff08;宽字节注入&#xff09;_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记3- bool注入&#xff08;布尔型盲注&#…

【ML特征工程】第 7 章 :通过K-Means 模型堆叠进行非线性特征化

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

计算机视觉之目标检测(object detection)《1》

在计算机视觉领域&#xff0c;除了识别图像并分类之外&#xff0c;我们很多时候想关注图像里面一些感兴趣的目标&#xff0c;比如视频监控中寻找一个或多个嫌疑犯&#xff1b;无人驾驶需要识别车辆、行人、红绿灯、路障等等&#xff0c;都是需要去及时掌握画面中的不同目标。我…

古瑞瓦特能源通过聆讯:上半年营收23亿 IDG投资9亿持股6.5%

雷递网 雷建平 11月26日古瑞瓦特能源&#xff08;简称&#xff1a;“Growatt Technology”&#xff09;日前递交招股书&#xff0c;准备在香港上市。上半年营收23.45亿古瑞瓦特能源于2011年在深圳成立&#xff0c;是一家分布式能源解决方案提供商&#xff0c;专注于可持续能源发…

Crack:GoJS 2.2.18 -2022-09-08 update

使用 JavaScript 和 TypeScript 为 Web 构建图表 流程图 构建交互式流程图或流程图。让您的用户使用 JSON 模型输出构建、修改和保存图表。状态图 可视化状态图和其他行为图。创建具有实时更新的图表以监控状态&#xff0c;或创建交互式图表以进行规划。桑基图 GoJS 允许对链接…

史上最全MATLAB误差分析工具箱,不看别后悔 【矢量化代码、效率嘎嘎快、支持计算50种指标】

在拟合、插值、模拟预测等计算中&#xff0c;往往需要通过不同指标参数来分析实际值与计算值之间差异依次衡量相关方法的可行性。常用的表征指标有残差平方和(SSE)、均方差(MSE)、均方根差(RMSE)、平均绝对误差(MAE)和决定系数R方(R-Squared)等等。 考虑到误差分析在实际应用中…

Kafka部署安装及简单使用

一、环境准备 1、jdk 8 2、zookeeper 3、kafka 说明&#xff1a;在kafka较新版本中已经集成了zookeeper&#xff0c;所以不用单独安装zookeeper&#xff0c;只需要在kafka文件目录中启动zookeeper即可 二、下载地址 Apache Kafka 三、部署 1、启动zookeeper -- 启动 .…

CSDN第11次竞赛题解与总结

CSDN第11次竞赛题解与总结前言建议题解T1圆小艺扩展完整代码T2K皇把妹完整代码T3筛选宝物完整代码T4圆桌完整代码总结前言 2022/11/27 CSDN第11次竞赛 由「壹合原码 & CSDN」联合主办 本次奖励还是不错的 (毕竟有赞助商)&#xff0c;前三十名都有奖励&#xff0c;连以前第…

跑步10年回望

回顾跑步这10年有点遗憾&#xff0c;最终还是决定放弃参加2022年厦马&#xff0c;因为要求更早到厦门&#xff0c;也担心回福州后影响小朋友上课&#xff0c;权衡之下还是决定申请退赛。本想在这次活动上实现全马破4的目标&#xff0c;却只能晒个退赛截图。。。今年是厦马20年&…

【敲级实用】:某小伙写了一个的办公脚本后~变精神了~

文章目录&#x1f4ef;小哔哔✏️注册有道智云✏️咋滴调用&#xff1f;✏️使用前的小操作✏️源代码专栏Python零基础入门篇&#x1f525;Python网络蜘蛛&#x1f525;Python数据分析Django基础入门宝典&#x1f525;小玩意儿&#x1f525;Web前端学习tkinter学习笔记Excel自…

基于储能电站服务的冷热电多微网系统双层优化配置(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

ETCD快速入门-01 ETCD概述

1.ETCD概述 1.1 ETCD概述 etcd是一个高可用的分布式的键值对存储系统&#xff0c;常用做配置共享和服务发现。由CoreOS公司发起的一个开源项目&#xff0c;受到ZooKeeper与doozer启发而催生的项目&#xff0c;名称etcd源自两个想法&#xff0c;即Linux的/etc文件夹和d分布式系…

一篇快速搞懂python模块、包和库

个人主页&#xff1a;天寒雨落的博客_CSDN博客-初学者入门C语言,python,数据库领域博主 &#x1f4ac; 热门专栏&#xff1a;python_天寒雨落的博客-CSDN博客 ​每日赠语&#xff1a;没有窘迫的失败&#xff0c;就不会有自豪的成功&#xff1b;失败不可怕&#xff0c;只要能从失…

用DIV+CSS技术设计的凤阳旅游网站(web前端网页制作课作业)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留下QQ~~~ 一、系统自带的语音引擎 语音播报的本质是将书面文字转换成自然语言的音频流&#xff0c;这个转换操作被称作语音合成&#xff0c;又称TTS&#xff08;从文本到语音&#xff09;在转换过程中&#xff0c;为了避免机械合成的呆板和停顿…

一款客服系统有哪些必备的功能模块?

为了提升客户服务质量&#xff0c;和客户更好地进行沟通&#xff0c;越来越多的企业配置了客服系统。那一款优秀的客服系统需要配置哪些功能模块呢&#xff1f; 1、支持多渠道接入 新媒体的快速发展使得企业有机会通过更多的渠道和客户进行联系&#xff0c;比如公众号、微博、…