1.什么前缀和?
简单来说,前缀和数组的每个元素存储的是原数组从起始位置到当前位置所有元素的累加和。
我们首先给定一组数据:1,3,5,7,9;最简单的情况就是求前n项和(这种情况我们很好实现),一般情况就是求一个区间的和,如:第2个数据到第4个数据的和:3+5+7 = 15;
2.为什么要用前缀和?
这是传统的求区间和的方法:
优点
- 实现简单:直接遍历法的逻辑非常直观,代码实现简单易懂,不需要额外的预处理步骤或复杂的数据结构,对于初学者来说很容易理解和掌握。
- 灵活性高:可以随时对任意区间进行求和计算,不需要预先对数组进行特殊处理,适用于区间查询较少且区间范围随机的情况。
缺点
- 效率较低:当需要进行多次区间和查询时,每次查询都需要重新遍历区间内的元素,会导致大量的重复计算,时间复杂度较高。例如,如果需要进行
m
次区间和查询,每次查询的区间长度平均为n
,那么总的时间复杂度将达到 (O(m * n),在数据规模较大或查询次数较多的情况下,性能会显著下降。
那么有没有效率更高的方法呢?
线段树,树状数组; 可这还是太吃操作,还有没有更简单方便的方法。有的有的,前缀和就是其中一个。
3.前缀和的原理
通过图可以知道,我们有一个arr数组,我们想要得到下标2 到 下标4的和,就用这5项的和减去前2项的和得到。
我们就应该会想到再创建一个数组来储存每个项的前项和。问题来了怎么储存起来了呢?
我们现在得到了每一项的前项和,我们就可以来求区间和了。
4.完整代码