news 2026/6/9 19:49:44

前缀和(一维, 二维)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前缀和(一维, 二维)

一.为什么我们要学前缀和

这里我想通过一道例题来解释为什么我们需要学前缀和?学前缀和有什么好处?

P8218 【深进1.例1】求区间和

题目描述

给定由nnn个正整数组成的序列a1,a2,⋯ ,ana_1, a_2, \cdots, a_na1,a2,,anmmm个区间[li,ri][l_i,r_i][li,ri],分别求这
mmm个区间的区间和。

输入格式

第一行包含一个正整数nnn,表示序列的长度。

第二行包含nnn个正整数a1,a2,⋯ ,ana_1,a_2, \cdots ,a_na1,a2,,an

第三行包含一个正整数mmm,表示区间的数量。

接下来mmm行,每行包含两个正整数li,ril_i,r_ili,ri,满足1≤li≤ri≤n1\le l_i\le r_i\le n1lirin

输出格式

mmm行,其中第iii行包含一个正整数,表示第iii组答案的询问。

输入输出样例 #1

输入 #1

4 4 3 2 1 2 1 4 2 3

输出 #1

10 5

说明/提示

样例解释

111到第444个数加起来和为101010。第222个数到第333个数加起来和为555

数据范围

对于50%50 \%50%的数据:n,m≤1000n,m\le 1000n,m1000

对于100%100 \%100%的数据:1≤n,m≤1051 \le n, m\le 10^51n,m1051≤ai≤1041 \le a_i\le 10^41ai104

对于这道题,如果我们根据输入临时求区间[l, r]的和,大概率会写出这样的代码

for(inti=1;i<=m;i++){cin>>l>>r;sum=0;for(intj=l;j<=r;j++){sum+=a[j];}}

显然,这样的算法的时间复杂度是O(mn)O(mn)O(mn), 肯定会超时,这时我就想引出前缀和,通过此法,可以极大压缩时间复杂度,达到以空间换时间的效果

二.前缀和原理

1.一维前缀和


如图所示,易得

prefixSum[i]=A[1]+A[2]+⋯+A[i−1]+A[i]prefixSum[i] = A[1] + A[2] + \dots + A[i - 1] + A[i]prefixSum[i]=A[1]+A[2]++A[i1]+A[i]

依据此公式我们可以非常轻松的求出[l,r][l, r][l,r]上数组AAA元素的和

即,suml,r=prefixSum[r]−prefixSum[l−1]sum_{l, r} = prefixSum[r] - prefixSum[l - 1]suml,r=prefixSum[r]prefixSum[l1]

和我们高中所学的数列是一个原理

在我们掌握了这个知识点之后, 只需要提前准备好prefixSumprefixSumprefixSum数组,上面那道题就可以这样求解了

for(inti=1;i<=m;i++){cin>>l>>r;sum=prefixSum[r]-prefixSum[l-1];}

此外前缀和还有一个递推公式可以帮助我们求prefixSumprefixSumprefixSum数组

prefixSum[i]=prefixSum[i−1]+A[i]prefixSum[i] = prefixSum[i - 1] + A[i]prefixSum[i]=prefixSum[i1]+A[i]

代码示例

for(inti=1;i<=n;i++){cin>>A[i];prefixSum[i]=prefixSum[i-1]+A[i];}

2.二维前缀和

在介绍完了以上比较简单的一维前缀和之后, 我还想再解释一下二维前缀和, 如果遇到给定矩形区域的范围, 我们是否也能用O(1)O(1)O(1)的时间复杂度求出区域内的数值之和呢? 答案当然是肯定的


同样的道理
prefixSum[i][j]=A[1][1]+A[1][2]+⋯+A[1][j−1]+A[1][j]+A[2][1]+A[2][2]+⋯+A[2][j−1]+A[2][j]+…+A[i][1]+A[i][2]+⋯+A[i][j−1]+A[i][j] \begin{aligned} prefixSum[i][j] = &A[1][1] + A[1][2] + \dots + A[1][j - 1] + A[1][j] +\\ &A[2][1] + A[2][2] + \dots + A[2][j - 1] + A[2][j] +\\ & \dots\\ &+ A[i][1] + A[i][2] + \dots + A[i][j - 1] + A[i][j] \end{aligned}prefixSum[i][j]=A[1][1]+A[1][2]++A[1][j1]+A[1][j]+A[2][1]+A[2][2]++A[2][j1]+A[2][j]++A[i][1]+A[i][2]++A[i][j1]+A[i][j]
由此我们可以得出
(x1,y1)(x1, y1)(x1,y1)为左上角,(x2,y2)(x2, y2)(x2,y2)为右下角的矩形区域内的元素和公式

sum(x1,y1),(x2,y2)=prefixSum[x2][y2]−prefixSum[x2][y1−1]−prefixSum[x1−1][y2]+prefixSum[x1−1][y1−1] \begin{aligned} sum_{(x1, y1), (x2, y2)} =& prefixSum[x2][y2] - prefixSum[x2][y1 - 1] -\\ &prefixSum[x1 - 1][y2] + prefixSum[x1 - 1][y1 - 1] \end{aligned}sum(x1,y1),(x2,y2)=prefixSum[x2][y2]prefixSum[x2][y11]prefixSum[x11][y2]+prefixSum[x11][y11]

例如, 我们可以轻松算出

sum(2,2),(3,4)=7+7+3+1+10+1=29sum_{(2, 2), (3, 4)} = 7 + 7 + 3 + 1 + 10 + 1 = 29sum(2,2),(3,4)=7+7+3+1+10+1=29


同样也有
sum(2,2),(3,4)=prefixSum[3][4]−prefixSum[3][1]−prefixSum[1][4]+prefixSum[1][1]=52−9−16+2=29 \begin{aligned} sum_{(2, 2), (3, 4)} =& prefixSum[3][4] - prefixSum[3][1] -\\ &prefixSum[1][4] + prefixSum[1][1] \\ =&52 - 9 - 16 + 2 \\ =&29 \end{aligned}sum(2,2),(3,4)===prefixSum[3][4]prefixSum[3][1]prefixSum[1][4]+prefixSum[1][1]52916+229

其实原理非常简单,利用容斥定理,我们要求出一个矩形区域内的元素和,就用
“一个大的,减去两边两个小的,然后多减的一块再加上就行”, 这点结合图示非常容易理解

这里还有一个二维前缀和的递推公式可以辅助我们求prefixSumprefixSumprefixSum数组

prefixSum[i][j]=prefixSum[i][j−1]+prefixSum[i−1][j]−prefixSum[i−1][j−1]+A[i][j]prefixSum[i][j] = prefixSum[i][j - 1] + prefixSum[i - 1][j] - prefixSum[i - 1][j - 1] + A[i][j]prefixSum[i][j]=prefixSum[i][j1]+prefixSum[i1][j]prefixSum[i1][j1]+A[i][j]

代码如下

for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){cin>>A[i][j];prefixSum[i][j]=prefixSum[i-1][j]+prefixSum[i][j-1]-prefixSum[i-1][j-1]+A[i][j];}}

三.总结

不论是一维前缀和还是二维前缀和,都是一种对数据的预处理,然后利用空间换时间的策略,如果这块掌握好了,可以极大的减少时间复杂度,提升代码的通过率

后续如果有空,我会在下面贴一些关于本节,且比较适合新手练手的题目…

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:19:56

SLA服务协议拟定:明确GLM-TTS可用性与响应时间承诺

SLA服务协议拟定&#xff1a;明确GLM-TTS可用性与响应时间承诺 在智能客服、有声书生成和虚拟主播等AI语音应用场景日益普及的今天&#xff0c;用户对语音合成系统的稳定性与实时性要求正变得越来越严苛。一个看似简单的“语音播报”背后&#xff0c;可能涉及复杂的模型推理、…

作者头像 李华
网站建设 2026/6/10 13:12:07

短文本5秒生成?实测GLM-TTS在A100上的响应速度

GLM-TTS在A100上的响应速度实测&#xff1a;短文本5秒生成是否可行&#xff1f; 在虚拟主播实时互动、智能客服秒级应答的今天&#xff0c;用户早已不再满足于“能说话”的语音系统——他们要的是像真人一样自然、又比真人更快响应的声音。传统TTS&#xff08;Text-to-Speech&a…

作者头像 李华
网站建设 2026/6/10 14:20:20

学历低?靠系统学习,也能逆袭优质实习单位

“学历不够&#xff0c;实习没门”——这是很多低学历求职者的共同焦虑。无数案例证明&#xff0c;学历只是求职的“敲门砖”之一&#xff0c;而非唯一通行证。只要找准方向&#xff0c;通过系统学习打造核心竞争力&#xff0c;低学历者同样能逆袭进入建行、工行、小鹏汽车等优…

作者头像 李华
网站建设 2026/6/10 13:35:15

【大数据架构:架构思想基础】Google三篇论文开启大数据处理序章:(数据存储)分布式架构、(数据计算)并行计算、(数据管理)分片存储

文章目录一、《GFS&#xff1a;谷歌文件系统》&#xff08;GFS: Google File System&#xff09;&#xff1a;分布式存储的奠基之作二、《MapReduce&#xff1a;简化大规模数据集的并行计算》&#xff08;MapReduce: Simplified Data Processing on Large Clusters&#xff09;…

作者头像 李华
网站建设 2026/6/10 14:30:32

Windows崩溃分析入门:minidump文件详细说明

蓝屏别慌&#xff01;一张 .dmp 文件如何揭开 Windows 崩溃的真相 你有没有遇到过这样的情况&#xff1a;电脑用得好好的&#xff0c;突然“啪”一下蓝屏重启&#xff0c;再开机几分钟后又蓝屏&#xff1f;反复几次&#xff0c;心态崩了。重装系统、换内存条、清灰……试了个…

作者头像 李华
网站建设 2026/6/10 12:04:52

Windows下React Native搭建环境完整指南

从零开始&#xff1a;Windows 上手 React Native 开发环境搭建实战指南 你是不是也经历过这样的时刻&#xff1f;兴致勃勃想用 React Native 写个跨平台 App&#xff0c;结果刚打开命令行输入 npx react-native run-android &#xff0c;一串红字就砸了过来——“找不到 SDK…

作者头像 李华