首页 > 编程语言 >算法学习1 前缀和与差分

算法学习1 前缀和与差分

时间:2023-03-22 18:33:38浏览次数:53  
标签:前缀 int 元素 差分 算法 数组 y1

一 前缀和是什么?

 顾名思义,就是数组里面,以原数组的和作为另一个数组元素的数组。

二 有何益裨?

求数组某个元素内,某一块区域内数据的和,并将他们的时间复杂度由O(n)降低到O(1)。

三 如何使用?

前缀和分为一维前缀和和二维前缀和

有如下几种情况:

设有A[9],成员为{1,2,3,4,5,6,7,8,9};

那么前缀和设为S[9],元素有{1,3,6,10,15,21,28,36,45};

公式如下:

一维前缀和:

S[ i ] - S[ i - 1 ]  =  A[ i ];所以S[ i ] = A[ i ] + S[ i - 1 ];

(  注意!这也是为什么前缀和与差分数组要从1而不是0开始的原因,因为“ 第一步 ”的空窗期要用A[0]和S[0]去填补。)

二维前缀和:

 

 

 

S[ i ][ j ] = S[ i - 1 ][ j ] + S[ i ][ j - 1] - S[ i - 1 ][ j - 1] + A[ i ][ j ];

 

 

 

OK,前缀和到此结束。


 

一 差分是什么?

(请注意 ,前缀和与差分的x轴与y轴,和我们平时接触的数学x轴y轴不一样,在这里横为y轴,纵为x轴。)

普遍来说,差分就是前缀和的逆运算。为什么呢?因为你看,前缀和的求值是“依靠原数组的数去求数组在不同位置上的和,并将此坐标作为前缀和数组的下标。”

而我理解的差分是“将原数组作为一个前缀和数组,然后通过逆运算列出每一步参与求和的元素,将这些元素与下标一一对应,便是差分数组了。”

 

二 差分用途与裨益?

差分既然作为每一步的求和元素,其实在求和过程的每一步重复(加上前元素总和和现元素)都是一个“迭代”的过程,我们可以利用这个特性去反过来“伪造”出一个在“任意范围”里添加了“任意元素”的前缀和数组“A”。

 

三 差分的使用方法?

差分大致可分为两步,

第一步:拆分析构;第二步:变量重组。

设有原数组Q[9],设立影子数组B[9];

一维差分:

B[ i ] = Q[ i ] - Q[ i - 1];

 

 

 在Q[ l ] 到Q[ r ]的范围里加上一个常数c;

B[ l ] += c;B[ r + 1 ] -= c;(加一再减去的作用是为了让c完整的覆盖整个{ l ~ r}范围)

最后,伪造原数组:B[ i ] += B[ i - 1]。

二维差分:

内容大致大同小异,唯一不同的就是线性变成了矩阵。

 

 

 构造insert函数,以便我们逆求前缀和数组:

1 void insert(int x1,int y1,int x2,int y2,int c)
2 {     //对b数组执行插入操作,等价于对a数组中的(x1,y1)到(x2,y2)之间的元素都加上了c
3     b[x1][y1] += c;
4     b[x2 + 1][y1] -= c;
5     b[x1][y2 + 1] -= c;
6     b[x2 + 1][y2 + 1] += c;
7 }

 把A[ i ][ t ]数组拆分进去的方法:

void insert ( i , t , i , t , A[ i ][ t ] ) ;

或者是直接构造法:

b[i][j] = a[i][j] − a[i − 1][j] − a[i][j − 1] + a[i −1 ][j − 1]

 

 

 

之后都是如法炮制,把需要修改的参数值放入insert函数中。

标签:前缀,int,元素,差分,算法,数组,y1
From: https://www.cnblogs.com/wangbohan/p/17161998.html

相关文章

  • 算法笔记的笔记——第6章 C++标准模板库(STL)
    vector变长数组长度根据需要而自动改变的数组可以用来以邻接表的方式储存图使用头文件:#include<vector>命名空间:usingnamespacestd;定义vector<typename>n......
  • 分布式搜索算法,算法
    对于搜索引擎来说,索引存放在成千上万台机器上,如何进行分布式搜索呢? 假设搜索结果是以分页的方式显示,以PageNumber代表当前页,从1开始,以PageSize代表页面大小,默认为10,以N代表......
  • 「ACM 算法实践」[解题报告]组队
    分析因为时间不多了,我一开始只考虑了\(a_i\)互不相等的情况,没想到居然拿到了60昏(正确解法是贪心+优先队列。而不是从「使得人数最少的队伍人数最多」中得到的二分......
  • 「ACM 算法实践」[解题报告]时间管理大师
    分析一开始想着应该要分情况讨论,如果每台电脑的耗电量都小于\(e\),那么可以知道小Q是可以一直学习下去的,如果存在电脑的耗电量大于等于\(e\),贪心的想法是将每台电脑......
  • 「ACM 算法实践」[解题报告]沙滩拾贝
    分析因为是与运算,只有当这\(m\)个数的第\(k\)位上都是\(1\)的时候才能使得最后的数的第\(k\)位为\(1\)。为了让最后的开心程度最大,我们优先将高位取\(1\),也......
  • 利用Mahout实现在Hadoop上运行K-Means算法
    class="full-post-title">利用Mahout实现在Hadoop上运行K-Means算法  一、介绍Mahout   Mahout是Apache下的开源机器学习软件包,目前实现的机器学习算法主要包含有协......
  • 高斯模糊的算法
    通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。算法有很多种,其中有一种叫做"高斯模糊"(GaussianBlur)。它将正态分布(又名"高斯分布")用于图像处理。本文介......
  • 机器学习算法
    一、分类算法(一)贝叶斯 (二)决策树ID3、C4.5(C5.0)、CART、PUBLIC、SLIQ和SPRINT(三)神经网络 (四)SVM (五)KNN (六)Bagging 和Boosting (七)最大熵(八)Logistic 回归(九)感知机二、聚类......
  • 复杂度分析:如何分析、统计算法的执行效率和资源消耗
    作者:京东物流崔旭我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指......
  • 算法的时间复杂度和空间复杂度
    常用的算法的时间复杂度和空间复杂度 排序法最差时间分析平均时间复杂度稳定度空间复杂度冒泡排序O(n2)O(n2)稳定O(1)快速排序O(n2)O(n*log2n)不稳定O(log2n)~O(n)选择排......