821| 10
|
[技术交流] 差分算法(仅总代码收费) |
差分是重要的区间专用数据结构,它有与前缀和不同的优势……
差分数据结构与前缀和正好相反,我们举个例子:
假如a[]是输入的数据,那么b[]是a[]的前缀和,这与我们上节课的定义基本一样,那如果b[]是输入数据,那么a[]是b[]的差分。大家可以理解上面那句话的意思了吗?如果不理解,我们通过一个例子:
我们如何构建a[]的差分呢?那么其实很简单,就是当前位置的数字减掉前面位置的数字。比如b[1]=a[1]-a[0],以此类推。构建出来的数组如下:
这就创建好了一个差分数组。构建差分数组的代码如下:
假如我们以上面例子,在[2,4]的中间区间添加数,那么做法很简单,在2的位置+4,在5的位置-4,此时有的同学肯定不理解为什么。 我们画一个图出来: [attach]174013[/attach] 我们需要知道,在2位置+4是对后面的所有数都+4的,因为差分仅保存两数之间距离,当它根据两数间距离恢复成前缀和数组时,就会知道它对每一个数都+4。那在5位置-4也是同理的。那么在5之后的位置既+4,又-4,就相当于抵消掉了,就只剩下2~4的区间添加了4,我们所需要的任务也完成了,正如下图一样: [attach]174014[/attach] 代码的写法很简单:
我们就应该根据b数组的差分形式重新构建普通数组,构建方法很简单,就是通过从1开始循环到6,然后将前面一位数的值加上当前差分的值,存入c[]即可,比如在c[1]的位置,就加入b[1]的差分结果,在c[2]的位置,就是c[1]+b[2]的结果。遍历之后的结果如下:
最后说说区间最大值,方法与区间求和类似,同样先求出原始数组,然后再找区间中的最大值,而优化方法也是用区间变量的方法,代码如下:
购买主题
已有 2 人购买
本主题需向作者支付 2 鱼币 才能浏览
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表于 2023-7-23 10:33:41
|
显示全部楼层
| ||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||
发表于 2023-7-23 11:37:44
|
显示全部楼层
| ||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||
发表于 2023-7-23 11:43:59
|
显示全部楼层
| ||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||
发表于 2023-7-23 11:45:35
|
显示全部楼层
| ||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||
发表于 2023-7-23 11:46:56
|
显示全部楼层
| ||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||
发表于 2023-7-23 11:52:58
|
显示全部楼层
| ||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||
发表于 2023-7-24 15:04:01
|
显示全部楼层
| ||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||
发表于 2023-7-24 15:11:04
|
显示全部楼层
| ||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
|
||
小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2024-11-21 19:51
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.