[旭说]前缀和算法

前缀和算法是一种用于预处理数组,以快速计算区间和的线性复杂度方法。通过一次线性遍历构建前缀和数组,后续查询可在常数时间内完成。常见应用包括一维和二维数组的区间查询,还能用于解决线段重合部分最大重合次数等复杂问题。通过起点加1、终点减1的处理,结合前缀和,可以将时间复杂度从O(nL)降低到O(n),但可能增加空间复杂度。优化方法可以通过链表等数据结构进一步减少空间浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题导入

在介绍什么是前缀和前,我们先来看这样一个问题,这里有一个n长度的数组,每个索引对应的的值是随机的,我们需要对这个数组做m次查询,每次查询会给出一个起点终点,我们需要返回对应闭区间内的值的和。
在这里插入图片描述

如上图,若第一次的询问为 [0,2] 则结果为13;
若第二次的询问为 [2,5] 则结果为47;
如果我们按照最简单的想法,那么我们处理这个查询的方式则为直接加法求和,从起点开始依次加到终点即可。
而对于这样的一个方法,我们假设最坏的情况,每次查询的长度均为n次,那么完成这种m次的查询所需要的时间大概为 n*m ,我们也可以自然推测出这个算法的时间复杂度为 O(mn)
如果数量级合适,那自然是够用的,但如果 n=20000,m=20000 的情况下,显然我们这样的算法是超时的,无法满足这种情况的需要,那么,有没有一种方法可以让我们能够不需要在每次查询时都进行遍历求和呢?
试想一下,倘若我们知道前5项的和 A 与前10项的和 B,那要求第6-10项的和可以怎么求呢

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值