# 差分法

Posted wonderfulzealoustom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# 差分法相关的知识,希望对你有一定的参考价值。

$color{red} ext{差分法是啥?}$

我们还是结合题目来理解吧:P1083 借教室

技术分享图片

如果浓缩一下题目的意思,如下:

有m个人,每个人要借di个教室,总共借si-ti天,现在要你尽可能地满足每个人的教室需求量。

按照常规思路,我们可能会建立一个结构体变量a数组,然后把所有信息都输进去。再用一个day数组记录每天有多少个教室被借出去,然后用一个for循环m次,每次一个for循环(ti-si)次,每次把day[i]++即第i天的教室数加一。

这样子看起来是很简单粗暴,但是这样的方法时间复杂度是n^2。我们还要加上输入的时间,还要考虑其他诸多因素,时间肯定会爆掉。

那么,有没有一种方法,可以使时间变得更短呢?

答案是,有。这就是今天我要介绍的差分法。

首先,我们建立几个数组:day[1000]、borrow[1000];其中day表示当天是否有教室借阅情况,初始值全都赋值为0.然后borrow我们等会再讲。如下图:

技术分享图片

然后,我们输入数据:

10 3
1 1 5
2 4 6
4 3 7

先处理第一组数据:3 1 5。表示3个教室从第1天借到第5天

我们在borrow表格里作如下处理:borrow[1]++,borrow[5+1]--;

技术分享图片

我们再在下面建立一个数组:res,来演示实际的day。

我们会发现:res[i]+borrow[i+1]=res[i+1]

技术分享图片

通过这种方法,我们就不必再去进行si-ti的循环,对每一天进行加法,我们只需要把这个天的头和尾做一个标记即可。

同理:如果di=2,我们只需要在borrow[4]+=2和borrow[6+1]-=2即可。
技术分享图片


以上是关于# 差分法的主要内容,如果未能解决你的问题,请参考以下文章

求基于OpenCV的三帧差分算法代码

差分数组(定义+性质+证明+代码实现+巩固练习)

二分法算法代码

数字信号处理线性常系数差分方程 ( 使用 matlab 求解 “ 线性常系数差分方程 “ 示例 | A 向量分析 | B 向量分析 | 输入序列分析 | matlab 代码 )

面试代码基础二分法binary Search Sorted Array

改进差分进化算法求解容量受限的车辆路径(CVRP)问题MATLAB代码