什么是差分数组?「建议收藏」

什么是差分数组?「建议收藏」问题背景如果给你一个包含5000万个元素的数组,然后会有频繁区间修改操作,那什么是频繁的区间修改操作呢?比如让第1个数到第1000万个数每个数都加上1,而且这种操作时频繁的。此时你应该怎么做?很容易想到的是,从第1个数开始遍历,一直遍历到第1000万个数,然后每个数都加上1,如果这种操作很频繁的话,那这种暴力的方法在一些实时的系统中可能就拉跨了。因此,今天的主角就出现了——差分数组。…

大家好,又见面了,我是你们的朋友全栈君。

问题背景

如果给你一个包含5000万个元素的数组,然后会有频繁区间修改操作,那什么是频繁的区间修改操作呢?比如让第1个数到第1000万个数每个数都加上1,而且这种操作时频繁的。

此时你应该怎么做?很容易想到的是,从第1个数开始遍历,一直遍历到第1000万个数,然后每个数都加上1,如果这种操作很频繁的话,那这种暴力的方法在一些实时的系统中可能就拉跨了。

因此,今天的主角就出现了——差分数组。

 

算法原型

比如我们现在有一个数组arr,arr={0,2,5,4,9,7,10,0}

什么是差分数组?「建议收藏」

那么差分数组是什么呢?其实差分数组本质上也是一个数组,我们暂且定义差分数组为d,差分数组d的大小和原来arr数组大小一样,而且d[i]=arr[i]-arr[i-1](i≠0),且d[i]=0,它的含义是什么?就是原来数组i位置上的元素和i-1位置上的元素作差,得到的值就是d[i]的值。

所以,例子中的arr数组其对应的差分数组值如下图所示。

什么是差分数组?「建议收藏」

那么构造了这么个玩意有什么用呢?难道是来浪费宝贵的内存空间的?嗯,确实是来浪费宝贵的内存了,但是却换了时间上的高效。

现在我们有这么一个区间修改操作,即在区间1~4上,所有的数值都加上3.

什么是差分数组?「建议收藏」

我们不要傻傻地遍历arr数组的[1,4]范围,然后再分别给每个值加上3,我们此时更改差分数组d即可。

显而易见,差分数组d在[2,4]范围内的值都不用改变,只需要改变差分数组位置1和位置5的值即可,即d[1]=d[1]+3,而d[5]=d[5]-3,其余不变,为什么呢?因为差分数组的定义——d[i]=arr[i]-arr[i-1]

什么是差分数组?「建议收藏」

现在,我们如何根据差分数组d来推测arr中某一个位置的值呢?

比如,此时,我们想知道arr[1]的值,我们不能直接通过arr[1]得到原来的值,因为在区间修改的操作中我们并没有修改arr的值,因此我们必须从前往后遍历递推,由于d[0]=arr[0]-0(我们定义arr[0]的前一个数为0),那么arr[0]=d[0]=0,又由于d[1]=arr[1]-arr[0]=5,那么arr[1]=5+arr[0]=5。以此类推,由于d[2]=arr[2]-arr[1]=3,所以arr[2]=3+arr[1]=8。

 

总结

可以看到,如果需要对L~R范围内所有数都进行相同的操作,我们不需要从L~R遍历arr然后在每个值上进行相同操作,只需要在差分数组d中改变L和R+1的值即可。但是在查询arr数组中某个位置的数时,却要根据差分数组从前往后递推求值。

所以,该方法适用于区间频繁修改,而且这个区间范围是比较大的,离线查询的情况。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130341.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月28日 下午5:00
下一篇 2022年4月28日 下午5:20


相关推荐

  • 网络地址是ip地址和子网掩码_ip地址和子网掩码之间的关系

    网络地址是ip地址和子网掩码_ip地址和子网掩码之间的关系网络基础之IP地址和子网掩码

    2022年8月3日
    8
  • UART串口流控制(Flow control)「建议收藏」

    UART串口流控制(Flow control)「建议收藏」一般在串行通讯中,我们会在一些上位机上看到RTS/CTS、DTR/DSR和XON/XOFF的选项,这是对流控制的选项,一般是应用于RS232接口的,是拿来调制解调器的数据通讯的一、流控制的作用这里讲到的“流”,指的是数据流;在数据通信中,流控制是管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然继续发送数据,所导致数据丢失二、工作原理当接收端的数…

    2022年6月5日
    220
  • 双模sa_七句话讲清NSA单模与SA+NSA双模5G手机的真实区别

    双模sa_七句话讲清NSA单模与SA+NSA双模5G手机的真实区别部分 5G 手机可能有网没信号 正确的理解应该是这样的 一 为何有双模 5G 全网通手机与单模 5G 手机的区别 1 目前在售的 5G 手机 包括仅支持 NSA 组网的高通 X50 平台 也就是所有非华为系的手机品牌的那些 5G 手机 与同时支持 NSA 与 SA 的海思麒麟 985 与麒麟 9905G 两个平台 即华为 荣耀 华为 Nova 的那些 5G 手机 这也是为何目前在售的 5G 智能手机 的宣传文案上 出现华为使用 5G 双模全网通

    2026年3月17日
    2
  • 请教前辈们一个关于锋利Jquery的问题

    请教前辈们一个关于锋利Jquery的问题大家好 web 的大侠前辈们 能问大家一个关于锋利 Jquery 问题吗 我是个初学者 觉得这本书讲得很适合新手 而且刚看到这本书的弟六章 jqueryAjax 可是按照书上教程编写的代码总是显示有错误 于是从网上下载原码 打开发现跟我一样的错误 就是关于 get 方法的例子 就是通过 Ajax get 方法获取 PHP 一个请求 然后把 data 值返回到当前的 Html 中 请教曾经看过些书的

    2026年3月16日
    2
  • mysql创建视图语句_MySQL创建视图的语法格式

    mysql创建视图语句_MySQL创建视图的语法格式视图 具有简化查询语句 安全性和保证逻辑数据独立性等作用创建视图的语法格式视图中 包含 SELECT 查询的结果 因此 视图的创建基于 SELECT 语句 和已经存在的数据表 视图可以建立在一张表上 也可以建立在多张表上 MySQL 中 使用 CREATEVIEW 语句 创建视图语法格式 CREATE ORREPLACE ALGORITHM UNDEFIEND MERGE TEMPTABLE

    2026年3月16日
    4
  • 游戏引擎之寒霜引擎

    游戏引擎之寒霜引擎Frostbite 引擎 FrostbiteEng 是 EADICE 开发的一款 3D 游戏引擎 主要应用于 2000 年代晚期的战地系列游戏 该引擎从 2006 年起开始研发 第一款使用寒霜引擎的游戏 战地 叛逆连队 在 2008 年上市 nbsp 多平台 Frostbite 引擎支持多种平台的后端 在 Xbox360 MicrosoftWin 上支持 DirectX9 0c 支持在 Window

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号