首页 > 其他分享 >前缀和和差分

前缀和和差分

时间:2025-01-05 12:31:48浏览次数:3  
标签:前缀 元素 差分 vector 数组 diff

前缀和(Prefix Sum)和差分(Difference Array)是处理数组问题时常用的两种数据结构或算法技巧,它们可以加速某些类型的查询,尤其是在涉及数组元素累积和或变化量的情况下。

前缀和(Prefix Sum)

前缀和是一种将数组元素的累积和存储在新数组中的技术。对于一个数组 a,其前缀和数组 prefixSum 定义如下:

prefixSum[i] = a[0] + a[1] + ... + a[i-1]

这样,你可以在 O(1) 时间内查询数组 a 中任意子区间 [l, r)(左闭右开)的和,计算方式为:

sum = prefixSum[r] - prefixSum[l]

用途

  • 快速计算任意子区间的元素和。
  • 处理与数组元素累积和有关的问题。

实现

vector<int> computePrefixSum(const vector<int>& a) {
    int n = a.size();
    vector<int> prefixSum(n, 0);
    for (int i = 1; i <= n; ++i) {
        prefixSum[i] = prefixSum[i - 1] + a[i - 1];
    }
    return prefixSum;
}

 

差分(Difference Array)

差分数组是一种基于原数组生成新数组的技术,新数组中的每个元素是原数组中相邻元素的差。对于一个数组 a,其差分数组 diff 定义如下:

diff[i] = a[i] - a[i - 1] (对于 i > 0diff[0] = a[0]

这样,你可以在 O(1) 时间内恢复原数组的任意元素,或者快速计算任意子区间的和。

用途

  • 快速修改数组中的元素(例如,对某个区间的所有元素同时加上或减去一个值)。
  • 处理与数组元素变化量有关的问题。

实现

vector<int> computeDifference(const vector<int>& a) {
    int n = a.size();
    vector<int> diff(n, 0);
    diff[0] = a[0]; // 第一个元素没有前一个元素,所以直接赋值
    for (int i = 1; i < n; ++i) {
        diff[i] = a[i] - a[i - 1];
    }
    return diff;
}

前缀和和差分都是处理数组问题的有效工具,它们可以显著提高某些类型问题的解决效率。在实际应用中,选择哪一种技术取决于问题的具体需求。 

标签:前缀,元素,差分,vector,数组,diff
From: https://blog.csdn.net/makeke123456/article/details/144932084

相关文章

  • 改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论
    目录 1电力系统环境经济调度数学模型电力系统环境经济调度问题概述多目标差分进化算法的应用应用研究的意义2  改进的多目标差分进化算法电力系统环境经济调度的基本概念多目标差分进化算法简介改进的多目标差分进化算法应用研究3Python代码实现3.1结果3.2P......
  • BUGAWAY算法小抄-差分数组
    BUGAWAY算法小抄-差分数组什么是差分数组?差分数组的思想是通过对原始数组进行处理,得到一个新的数组(差分数组),利用该数组来高效地进行区间更新操作。具体来说,差分数组记录的是相邻元素之间的差值,而不是原始数组的元素本身。差分数组的原理1.差分数组的构造:假设有一个数组A=......
  • 如何在梯度计算中处理bf16精度损失:混合精度训练中的误差分析
    如何在梯度计算中处理bf16精度损失:混合精度训练中的误差分析在现代深度学习训练中,为了加速计算并节省内存,越来越多的训练任务采用混合精度(MixedPrecision)技术,其中常见的做法是使用低精度格式(如bf16或fp16)进行前向传播和梯度计算,而使用高精度格式(如fp32)进行参数更新......
  • 牛客 NC20032 激光炸弹 二维前缀和
    #include<bits/stdc++.h>usingnamespacestd;inta[5010][5010];intpre[5010][5010];constintN=5e3;intmain(){ intn,m; cin>>n>>m; for(inti=0;i<n;i++) { intx,y,z; cin>>x>>y>>z; a[x][y]=z; } pre[0][0......
  • [算法/数据结构]系列 华为面试原题:和为n的子串(前缀和+哈希表)
    [算法/数据结构]系列华为面试原题:和为n的子串(前缀和+哈希表)文章目录[算法/数据结构]系列华为面试原题:和为n的子串(前缀和+哈希表)面试原题样例分析代码及思路面试原题输入一串只有0和1的数组,返回输入和为n的子串的个数。样例:输入:[011100],n=3输出:6样......
  • 实现 Trie (前缀树)(字典树)
    Trie(发音类似"try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。请你实现Trie类:Trie() 初始化前缀树对象。voidinsert(Stringword) 向前缀树中插入字符串 word 。booleanse......
  • 【算法一周目】从时光的边缘看世界:前缀和揭示的算法真谛
    文章目录1.一维前缀和2.二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为k的子数组6.和可被k整除的子数组7.连续数组8.矩阵区域和1.一维前缀和题目链接:【模板】一维前缀和题目描述:给定一个长度为n的整数数组arr和q个查询,每个查询由两个整数l......
  • 4 中心差分和迎风差分
    4中心差分和迎风差分背景在《3.有限体积法:推导方程》等之前的课程中,我们已经讨论了如下方程,一个是稳态对流-扩散方程:\[\begin{equation}\nabla\cdot(\rho\boldsymbol{u}\phi)=\nabla\cdot(\Gamma\nabla\phi)^{+}S_{\phi}\end{equation}\]它关于一个控制体积的积分形式......
  • 4 中心差分和迎风差分
    4中心差分和迎风差分背景在《3.有限体积法:推导方程》等之前的课程中,我们已经讨论了如下方程,一个是稳态对流-扩散方程:\[\begin{equation}\nabla\cdot(\rho\boldsymbol{u}\phi)=\nabla\cdot(\Gamma\nabla\phi)^{+}S_{\phi}\end{equation}\]它关于一个控制体积的积分形式......
  • zshrc中的(eval) 前缀是什么?
    在我的配置文件中有这样几行配置:#python-click<8.0eval"$(_PYMOBILEDEVICE3_COMPLETE=source_zshpymobiledevice3)"#python-click>=8.0eval"$(_PYMOBILEDEVICE3_COMPLETE=zsh_sourcepymobiledevice3)"这几行配置的作用是在 Zsh中使用pymobiledevice3命令的参数......