Python算法:前缀和与差分

前缀和:        

数组a[0]~a[n-1],前缀和sum[i]等于a[0]~a[i]的和:

sum[0]=a[0]        sum[1]=a[0]+a[1]        sum[2]= a[0]+ a[1]+a[2]

能在0(n)时间内求得所有前缀和:sum[i] = sum[i-1]+a[i]

预计算出前缀和,能快速计算出区间和: a[i] + a[i+1] +... +a[j-1]+a[j]= sum[j]- sum[i-1]

复杂度为O(n)的区间和计算,优化到了O(1)的前缀和计算

前缀和与差分的关系

一维差分数组D[k]=a[k] -a[k-1],即原数组a[ ]的相邻元素的差

a[k]=D[1]+ D[2] +...+D[k]

a[ ]是D[ ]的前缀和

差分是前缀和的逆运算:把求a[k]转化为求D的前缀和

差分数组能提高修改的效率:

把区间[L,R]内每个元素a[ ]加上d,只需要把对应的D[ ]做以下操作:

  (1)把D[L]加上d:              D[L] +=d

    (2)把D[R+1]减去d:        D[R+1]-=d

原来需要O(n)次计算,现在只需要O(1)

利用D[ ],能精确地实现只修改区间[L,R]内元素的目的。原来需要O(n)次计算,现在只需要O(1)

前缀和a[x]=D[1]+D[2] +..+D[x],有:

        (1)1≤x<L,前缀和a[x]不变;

        (2)L≤x≤R,前缀和a[x]增加了d;

        (3)R<x≤N,前缀和a[x]不变,因为被D[R+1]中减去的d抵消了。

二维数组前缀和:

这里的前缀指的是从(0,0) 到 (x,y)这个矩形区域,其和就是 s[x][y]
前缀和的推导公式 s[i][j] = s[i-1][j] + s[i][j-1]- s[i-1][j-1] + val[i][j]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值