日野弥生:勉強しよう

prefix sum

发表于2024年12月10日

#前缀和 #区间和 #部分和

介绍

前缀和可以简单理解为「数列的前 n 项的和」,能降低查询的时间复杂度。C++ 标准库中也实现了:std::partial_sum。具体应用在单维和多维数组、树等结构。

快速求数组前 i 项之和
快速求数组的 [i,j] 范围内的和
快速求二维矩阵中某个子矩阵之和

递推

$B[0] = A[0]$,对于 i \geq 1 则 $B[i] = B[i-1] + A[i]$。

变化

但是,在计算 [i,j] 区间和时,若 i 为 0 得单独讨论,否则 i-1 小于 0 会越界。为了让两种区间使用同一种计算公式,使用前缀和算法时,通常会令前缀和数组的长度为原数组的长度加一,使preSum[0] = 0。从而前缀和定义为:

$preSum[i] = nums[0] + nums[1] + … + nums[i-1]$

则对于前缀和数组的任一项有:$preSum[i] = preSum[i-1] + nums[i-1]$,此时只需谨记前缀和数组的下标与原数组下标不是直接对应,而是加一对应。即 preSum[i] 表示 nums 前 i-1 项的,不包含当前元素 nums[i]。

那么,对于任意 $i<=j<len(nums)$ ,数组 [i,j] 区间和公式:

$sum(i, j) = preSum[j + 1] - preSum[i]$

算法思想:https://oi-wiki.org/basic/prefix-sum/

上一篇

『老爷老爷,不好了,门口来了许多日本人』

下一篇

binary search