一、前缀和算法概念
前缀和算法,也称为累积和算法,是一种用于高效计算数组或序列前缀和的方法。前缀和指的是数组中前n个元素的和,其中n可以是任意位置。前缀和算法的主要思想是通过预处理构建一个额外的数组或序列,其中每个元素存储原数组对应位置之前的所有元素的和。
前缀和算法的优势在于可以在O(1)的时间复杂度内查询任意位置的前缀和。
需要频繁查询或计算区间和的问题非常有用。
例如求解数组中某个区间内的元素和、求解连续子数组和最大的问题等。
二、具体实现
1.一维前缀和
前缀和数组实现步骤:
1.创建一个与原数组形状相同的数组。
2.对于索引0的元素单独赋值,否则在后续创建前缀和数组时会越界错误。
3.一个for循环遍历索引,核心公式如下
s u m i = s u m i − 1 + a r r a y i sum_i=sum_{i-1}+array_i sumi=sumi−1+arrayi
查询函数实现步骤
说明:前面得到的前缀和数组都是从第一个元素开始的,也就是说左边界是索引0,右边界可变,但实际上我们想得到任意区间范围内的,也就是左右边界都可以自己设置。这样一旦创建好了前缀和数组,后续查找不需要使用循环,减少了时间复杂度。
1.需要接受的变量:【l:左边界】 【r:右边界】 【sum_array:已经得到的前缀和数组】
2.核心公式:(注意是r减去l-1!!!!!)
a n s w e r = s u m r − s u m l − 1 answer=sum_r-sum_{l-1} answer=sumr−suml−1
代码如下(示例):
import numpy as np
def creat_front_sum(array):
sum_array=np.zeros_like(array)
sum_array[0]=array[0]
for i in range(1,len(array)):
sum_array[i]=sum_array[i-1]+array[i]
return sum_array
def query(l,r,sum_array):
#防止越界
if l==0:
answer=sum_array[r]
else:
answer=sum_array[r]-sum_array[l-1]
return answer
if __name__=='__main__':
array=np.array([1,2,3,4,5,6