一维前缀和的实现

         这是C++算法基础-基础算法专栏的第十一篇文章,专栏详情请见此处


引入

        我们用朴素做法求一维数组的区间和时,一般是从前向后循环累加,它的时间复杂度为O(n),当求区间和的次数过多,则会有超时的可能,那有没有时间复杂度更低的做法呢?当然有,这就是前缀和做法,它求区间和的时间复杂度为O(1)

        下面我们就来讲一维前缀和的实现。

定义

        前缀和是一种重要的预处理方式,能大大降低查询的时间复杂度。

过程

        表示

        对于原数组a,一维前缀和额外开辟了一个数组b,对于每个b\left [ i \right ],储存了a\left [ i \right ]-a\left [ i-1 \right ],也就是说,s_{x}=\sum_{i=1}^{x}a_{i}

        赋值

        赋值操作一般在输入数组a时同时进行,我们可以容易得出其递推公式:s\left [ i \right ]=s\left [ i-1 \right ]+a\left [ i \right ]

        求区间和

        当我们想得到a数组区间\left [ l,r \right ]中的和,应该怎么去做呢?这里我们用图表加以理解,0表示当前位未计入总和,1表示当前位计入总和(后图同理)。

        首先,图一展示了起始状态,然后,我们将s\left [ r \right ]计入总和(图二),也就是计算了a\left [ 1 \right ]\sim a\left [ r \right ]的和,但我们并不需要a\left [ l \right ]之前的数计入总和,所以最后将s\left [ l-1 \right ]减去(图三)。

        得出结论:a\left [ l \right ]+\cdots +a\left [ r \right ]=s\left [ r \right ]-s\left [ l-1 \right ]

        代码

        下面给出一维前缀和代码:

表示:s[i]=a[1]+a[2]+...+a[i]
赋值:s[i]=s[i-1]+a[i]
求和:a[l]+...a[r]=s[r]-s[l-1]

上一篇-高精度除法的实现    C++算法基础专栏文章    下一篇-二维前缀和的实现


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值