Andysun06的博客

  • 首页
  • 文章列表 
  • 博客统计
  • 个人中心
Andysun06的博客
  1. 首页
  2. C++语言
  3. 正文

差分思想详解

2021年8月27日 138点热度 0人点赞 0条评论

举个例子,有一个数组 a[]={ 1,5,3,7,2,8 } ,他的差分数组就是 b[]={ 1,4,-2,4,-5,6 }

a 1 5 3 7 2 8
b 1 4 -2 4 -5 6

想必你也很快发现了他们之间的联系,b_i=a_i-a_{ i-1 } ,因此可以推出 a_i=b_1+b_2+b_3+...+b_i 。

当我们把 a_{2} 到 a_5 都加上 2 后,数组 a 就变成了 a[]={ 1,7,5,9,4,8 }

a 1 7 5 9 4 8

然后我们在重新计算一下 b 数组,计算结果是这样的: b[]={ 1,6,-2,4,-5,4 }

b 1 6 -2 4 -5 4

有发现什么规律吗?

是的,当 a 数组的 a_{2} 到 a_5 改变了数值后,b 数组只有 b_2 和 b_6 发生了变化,并且变化也是有规律的, b_2加了2 , b_6 减了 2,因此,我们就可以用差分数组来记录原数组的数值变化,那如何记录变化呢?用前缀和

让我们一起来计算一下 b 数组在变化后的前缀和,计算结果是这样的:q[]={ 0,2,2,2,2,0 }

q 0 2 2 2 2 0

没错!刚好就是 a 数组变化的数值。

现在知道差分思想了吧,就是用差分数组记录原数组的变化,当需要询问a是把原数组和差分数组的前缀和加起来,就可以了,这种思想用法很广,时间复杂度比直接修改要低,值得一学~


有疑问可以在评论区提出,如果对你有帮助就点个赞再走呗~

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: C++ 信息奥赛 原创 总结 笔记
最后更新:2021年10月6日

Andysun06

王帅加油!!!

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 hackingfans.top. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

油
加
王
帅