【算法基础】差分算法及其应用

简介: 【算法基础】差分算法及其应用

前缀和

要想知道差分算法,就要先知道前缀和算法, 应为差分是前缀和的逆运算。

定义

对于一个数组a,某一个数的前缀和表示这个数以及前面所有数的和

例如:

  • 对于数组a1,a2,……,an
  • 存在一个数组b1,b2,……,bn
  • 使得b1 = a1, bi = a1+…+ai = ai+bi-1

前缀和公式

S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]

前缀和的应用

对于前缀和算法,应用的场景是:在区间内进行查询或对子数组进行其他操作

1.利用前缀和计算区间的和

输入一个长度为n的整数序列。

接下来再输入m个询问,每个询问输入一对l, r。

对于每个询问,输出原序列中从第l个数到第r个数的和。
输入格式

第一行包含两个整数n和m。

第二行包含n个整数,表示整数数列。

接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。
输出格式

共m行,每行输出一个询问的结果。

数据范围

1≤l<r ≤n,

1≤n, m ≤100000,

-1000≤数列中元素的值≤1000

#include<iostream>
using namespace std;
const int N = 1e5+10;
int w[N], s[N];   //w存储数组,s存储前缀和
int n, m, l, r; 
int main(){
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> w[i];
  for(int i = 1; i <= n; i++) s[i] = s[i-1]+w[i]; //更新前缀和
  for(int i = 0; i < m; i++){
    cin >> l >> r;
    cout << s[r]-s[l-1] << endl;    //区间和等于右边界前缀和-左边界前面的和
  } 
  return 0;
}

2.利用前缀和进行优化

【AcWing每日一题】4644. 求和


差分

定义

差分是在前缀和的基础上定义的,是前缀和的逆运算

  • 对于一个数组b1,b2,……,bn
  • 设其前缀和组成的数组为a1,a2,……,an
  • 即①a1 = b1; ②a2 = b1+b2; ③a3 = b1+b2+b3……
  • 则称数组a的差分是数组b

差分的应用

差分的应用场景:对于一个数组在区间[l,r]上对每个数进行操作

1.对区间的每个数进行操作

输入一个长度为n的整数序列。

接下来输入m个操作,每个操作包含三个整数l,r,c,表示将序列中[,r]之间的每个数加上c。

请你输出进行完所有操作后的序列。
输入格式

第一行包含两个整数n和m。

第二行包含n个整数,表示整数序列。

接下来m行,每行包含三个整数l, r, c,表示一个操作。
输出格式

共一行,包含n个整数,表示最终序列。

数据范围

1≤n, m ≤100000, 1<l<r ≤n,

-1000<c≤1000,

-1000≤整数序列中元素的值≤1000
思路:

  • 由于a是b的前缀和,所以b在第i个位置的数加(减)c就等价于他的前缀和从i位置的数之后都加(减)一个c
  • 当限定在一个[l,r]区间内,需要两次操作:
    首先,在b的第l个位置加c,使得原数组第l个位置后面都加c。但是r后面多加了c!
  • 然后,在b的第r+1个位置减c,使得原数组只有[l,r]区间内加了c。
  • 由于这个题最终要落实到原数组,所以,利用原数组是差分数组的前缀和,将差分数组的前缀和填入原数组即可。
#include<iostream>
using namespace std;
const int N = 1e5+10;
int w[N], s[N];   //w存储原数组,s存储差分数组
int n, m, l, r, c; 
int main(){
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> w[i];
  for(int i = 1; i <= n; i++) s[i] = w[i]-w[i-1]; //更新差分数组
  for(int i = 0; i < m; i++){
    cin >> l >> r >> c;
    s[l] += c;
    s[r+1] -= c;
  }
  for(int i = 1; i <= n; i++) w[i] = s[i]+w[i-1];
  for(int i = 1; i <= n; i++) cout << w[i] << " " ;
  return 0;
} 

2. 前缀和与差分的综合

【AcWing每日一题】4655. 重新排序

相关文章
|
3月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
184 0
|
2月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
219 14
|
2月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
227 3
|
2月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
2月前
|
机器学习/深度学习 边缘计算 分布式计算
基于差分进化算法的微电网调度研究(Matlab代码实现)
基于差分进化算法的微电网调度研究(Matlab代码实现)
129 1
|
2月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
2月前
|
机器学习/深度学习 算法 安全
小场景大市场:猫狗识别算法在宠物智能设备中的应用
将猫狗识别算法应用于宠物智能设备,是AIoT领域的重要垂直场景。本文从核心技术、应用场景、挑战与趋势四个方面,全面解析这一融合算法、硬件与用户体验的系统工程。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习模型、算法与应用的全方位解析
深度学习,作为人工智能(AI)的一个重要分支,已经在多个领域产生了革命性的影响。从图像识别到自然语言处理,从语音识别到自动驾驶,深度学习无处不在。本篇博客将深入探讨深度学习的模型、算法及其在各个领域的应用。
880 3
|
4月前
|
机器学习/深度学习 人工智能 算法
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
|
4月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
152 1

热门文章

最新文章

下一篇
oss云网关配置