当前位置: 首页 > article >正文

一维差分与二维差分

差分(Difference)是一种与前缀和密切相关的技术,主要用于高效处理区间更新操作。差分数组的核心思想是通过记录相邻元素的差值来表示原数组的变化,从而将区间更新操作的时间复杂度从 O(n) 优化到 O(1)。下面详细讲解一维差分和二维差分的原理、构建方法及应用。


一、一维差分

1. 定义
  • 差分数组 diff 的每个元素 diff[i] 表示原数组 arr 中相邻元素的差值,即:
    [
    \text{diff}[i] = \text{arr}[i] - \text{arr}[i-1]
    ]
  • 例如,原数组 arr = [1, 3, 6, 10],差分数组为 diff = [1, 2, 3, 4]
2. 构建方法
  • 初始化 diff[0] = arr[0]
  • 递推公式:
    [
    \text{diff}[i] = \text{arr}[i] - \text{arr}[i-1]
    ]
  • 代码实现
    vector<int> buildDiff(vector<int>& arr) {int n = arr.size();vector<int> diff(n, 0);diff[0] = arr[0];for (int i = 1; i < n; i++) {diff[i] = arr[i] - arr[i - 1];}return diff;
    }
    
3. 区间更新
  • 对原数组 arr 的区间 [L, R] 进行更新(增加一个值 val):
    [
    \text{diff}[L] += \text{val}, \quad \text{diff}[R+1] -= \text{val}
    ]
  • 示例
    arr = [1, 3, 6, 10],对区间 [1, 2] 增加 2
    [
    \text{diff}[1] += 2, \quad \text{diff}[3] -= 2
    ]
    更新后的差分数组为 diff = [1, 5, 3, 2]
4. 还原原数组
  • 通过差分数组 diff 还原原数组 arr
    [
    \text{arr}[i] = \text{arr}[i-1] + \text{diff}[i]
    ]
  • 代码实现
    vector<int> restoreArray(vector<int>& diff) {int n = diff.size();vector<int> arr(n, 0);arr[0] = diff[0];for (int i = 1; i < n; i++) {arr[i] = arr[i - 1] + diff[i];}return arr;
    }
    
5. 应用场景
  • 高效处理区间更新操作(如区间加、区间减)。
  • 解决需要频繁更新和查询的问题(如航班预订统计)。

二、二维差分

1. 定义
  • 二维差分数组 diff 的每个元素 diff[i][j] 表示原矩阵 matrix 中相邻元素的差值。
  • 例如,矩阵 matrix = [[1,2],[3,4]],差分数组为:
    [
    \text{diff} = \begin{bmatrix}
    1 & 1 \
    2 & 0 \
    \end{bmatrix}
    ]
2. 构建方法
  • 初始化 diff[0][0] = matrix[0][0]
  • 递推公式:
    [
    \text{diff}[i][j] = \text{matrix}[i][j] - \text{matrix}[i-1][j] - \text{matrix}[i][j-1] + \text{matrix}[i-1][j-1]
    ]
  • 代码实现
    vector<vector<int>> build2DDiff(vector<vector<int>>& matrix) {int m = matrix.size();int n = matrix[0].size();vector<vector<int>> diff(m, vector<int>(n, 0));diff[0][0] = matrix[0][0];for (int i = 1; i < m; i++) {diff[i][0] = matrix[i][0] - matrix[i - 1][0];}for (int j = 1; j < n; j++) {diff[0][j] = matrix[0][j] - matrix[0][j - 1];}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {diff[i][j] = matrix[i][j] - matrix[i - 1][j] - matrix[i][j - 1] + matrix[i - 1][j - 1];}}return diff;
    }
    
3. 区间更新
  • 对原矩阵 matrix 的子矩阵 (x1, y1)(x2, y2) 进行更新(增加一个值 val):
    [
    \text{diff}[x1][y1] += \text{val}, \quad \text{diff}[x2+1][y1] -= \text{val}, \quad \text{diff}[x1][y2+1] -= \text{val}, \quad \text{diff}[x2+1][y2+1] += \text{val}
    ]
  • 示例
    matrix = [[1,2],[3,4]],对子矩阵 (0,0)(1,1) 增加 2
    [
    \text{diff}[0][0] += 2, \quad \text{diff}[2][0] -= 2, \quad \text{diff}[0][2] -= 2, \quad \text{diff}[2][2] += 2
    ]
    更新后的差分数组为 diff = [[3,1],[2,0]]
4. 还原原矩阵
  • 通过差分数组 diff 还原原矩阵 matrix
    [
    \text{matrix}[i][j] = \text{matrix}[i-1][j] + \text{matrix}[i][j-1] - \text{matrix}[i-1][j-1] + \text{diff}[i][j]
    ]
  • 代码实现
    vector<vector<int>> restoreMatrix(vector<vector<int>>& diff) {int m = diff.size();int n = diff[0].size();vector<vector<int>> matrix(m, vector<int>(n, 0));matrix[0][0] = diff[0][0];for (int i = 1; i < m; i++) {matrix[i][0] = matrix[i - 1][0] + diff[i][0];}for (int j = 1; j < n; j++) {matrix[0][j] = matrix[0][j - 1] + diff[0][j];}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {matrix[i][j] = matrix[i - 1][j] + matrix[i][j - 1] - matrix[i - 1][j - 1] + diff[i][j];}}return matrix;
    }
    
5. 应用场景
  • 高效处理子矩阵更新操作(如子矩阵加、子矩阵减)。
  • 图像处理中的区域像素更新。

三、对比总结

特性一维差分二维差分
数据结构一维数组二维数组
构建复杂度O(n)O(mn)
更新复杂度O(1)O(1)
核心公式diff[i] = arr[i] - arr[i-1]diff[i][j] = ...(见上文)
应用问题区间更新、航班预订统计子矩阵更新、图像处理

四、经典例题

  1. 一维差分

    • LeetCode 1109. 航班预订统计
    • LeetCode 370. 区间加法
  2. 二维差分

    • LeetCode 2536. 子矩阵元素加 1

相关文章:

一维差分与二维差分

差分&#xff08;Difference&#xff09;是一种与前缀和密切相关的技术&#xff0c;主要用于高效处理区间更新操作。差分数组的核心思想是通过记录相邻元素的差值来表示原数组的变化&#xff0c;从而将区间更新操作的时间复杂度从 O(n) 优化到 O(1)。下面详细讲解一维差分和二维…...

EasyRTC嵌入式WebRTC视频通话SDK支持Web浏览器、Linux、ARM、Android、iOS

随着互联网技术的飞速发展&#xff0c;实时通信&#xff08;RTC&#xff09;已经成为现代应用中不可或缺的一部分。无论是视频会议、在线教育、远程医疗&#xff0c;还是社交娱乐&#xff0c;实时通信技术都在其中扮演着重要角色。 然而&#xff0c;WebRTC技术在PC和移动端的支…...

数据库脚本MySQL8转MySQL5

由于生产服务器版本上部署的是MySQL5&#xff0c;而开发手里的脚本代码是MySQL8。所以只能降版本了… 升级版本与降级版本脚本转换逻辑一样 MySQL5与MySQL8版本SQL脚本区别 大多数无需调整、主要是字符集与排序规则 MySQL5与MySQL8版本SQL字符集与排序规则 主要操作&…...

【PGCCC】commit_delay 对性能的提升:PostgreSQL 基准测试

通过禁用参数可以来调整事务工作负载synchronous_commit。该措施有惊人效果。但在操作系统崩溃期间丢失已提交事务的可能性使其成为许多应用程序无法启动的因素。因此我决定写下来。 WAL 刷新是事务数据库工作负载的瓶颈 为了确保已提交的事务不会丢失&#xff0c;PostgreSQL…...

AI大模型随机初始化权重并打印网络结构方法(以Deepseekv3为例,单机可跑)

背景 当前大模型的权重加载和调用&#xff0c;主要是通过在HuggingFace官网下载并使用transformer的库来加以实现&#xff1b;其中大模型的权重文件较大&#xff08;部分>100GB&#xff09;&#xff0c;若只是快速研究网络结构和数据流变化&#xff0c;则无需下载权重。本文…...

字符串解码——巧妙使用递归解题

题目描述 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。编码规则为 k[encoded_string]&#xff0c;表示方括号内部的 encoded_string 重复 k 次。其中 k 是正整数&#xff0c;输入字符串确保符合格式要求且无额外空格。 示例&#xff1a; 复制 示例 1&#…...

Flask Web开发的重要概念和示例

一口气列举Flask Web应用的所有概念和示例 Flask Web 应用基本框架 路由(Routing) 模版(Template) request 对象 JSON 数据处理 redirect 示例 文件上传示例 文件下载示例 Session 示例 Cookie操作 Flask Web 应用基本框架 这是一个 最基础的 Flask Web 应用,…...

51-ArrayList

51-ArrayList Collection 类型介绍 仓颉中常用的几种基础 Collection 类型&#xff0c;包含 Array、ArrayList、HashSet、HashMap。 可以在不同的场景中选择适合对应业务的类型&#xff1a; Array&#xff1a;如果不需要增加和删除元素&#xff0c;但需要修改元素&#xff…...

Ollama+WebUI+DeepSeek部署自己的本地大模型

前言 使用AI几乎成为互联网工作者必备技能了&#xff0c;DeepSeek的出现把AI再次推向高潮&#xff0c;在本文中&#xff0c;我们将带领大家借助 Ollama、WebUI 和 deepseek 这三个工具&#xff0c;成功搭建属于自己的本地大模型环境。Ollama 作为一款轻量级的大模型运行工具&a…...

(篇六)基于PyDracula搭建一个深度学习的软件之新版本ultralytics-8.3.28调试

ultralytics-8.3.28版本debug记录 1传入文件 代码太多不粘贴在这里了&#xff0c;完整代码写在了篇三 def open_src_file(self):config_file config/fold.jsonconfig json.load(open(config_file, r, encodingutf-8))open_fold config[open_fold]if not os.path.exists(op…...

NLP Word Embeddings

Word representation One-hot形式 在上一周介绍RNN类模型时&#xff0c;使用了One-hot向量来表示单词的方式。它的缺点是将每个单词视为独立的&#xff0c;算法很难学习到单词之间的关系。 比如下面的例子&#xff0c;即使语言模型已经知道orange juice是常用组合词&#xf…...

基于 FPGA 的嵌入式系统硬件逻辑优化技术探究

在数字化浪潮席卷全球的当下&#xff0c;嵌入式系统已然成为众多领域不可或缺的核心力量。从我们日常使用的智能手机、智能穿戴设备等消费电子产品&#xff0c;到关乎工业生产效率与精度的工业控制系统&#xff0c;再到汽车电子领域的自动驾驶辅助系统以及航空航天领域的飞行器…...

使用HX搭建UNI-APP云开发项目(适合新手小白与想学云开发的宝子)

什么是uni-app云开发 uni-app云开发是uni-app提供的一套后端服务,它可以帮助开发者快速搭建起一个完整的后端服务,包括数据库、云函数、存储等。开发者只需要关注前端页面的开发,后端服务由uni-app云开发提供。 uni-app云开发的优势: 快速搭建后端服务:uni-app云开发提供了…...

sql:时间盲注和boolen盲注

关于时间盲注&#xff0c;boolen盲注的后面几个获取表、列、具体数据的函数补全 时间盲注方法 import time import requests# 获取数据库名 def inject_database(url):dataname for i in range(1, 20):low 32high 128mid (low high) // 2while low < high:payload &q…...

【STM32】ADC|多通道ADC采集

本次实现的是ADC实现数字信号与模拟信号的转化&#xff0c;数字信号时不连续的&#xff0c;模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法&#xff0c;使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时&#xff0c;0~ 3.3v(模拟信…...

arcgis for js实现层叠立体效果

在 Web 开发中&#xff0c;利用 ArcGIS for JS 实现一些炫酷的地图效果能够极大地提升用户体验。本文将详细介绍如何使用 ArcGIS for JS 实现层叠立体效果&#xff0c;并展示最终的效果图。 效果图 实现思路 要实现层叠立体效果&#xff0c;关键在于获取边界图形的坐标&#xf…...

多模态本地部署和ollama部署Llama-Vision实现视觉问答

文章目录 一、模型介绍二、预期用途1. 视觉问答(VQA)与视觉推理2. 文档视觉问答(DocVQA)3. 图像字幕4. 图像-文本检索5. 视觉接地 三、本地部署1. 下载模型2. 模型大小3. 运行代码 四、ollama部署1. 安装ollama2. 安装 Llama 3.2 Vision 模型3. 运行 Llama 3.2-Vision 五、效果…...

【DeepSeek】deepseek可视化部署

目录 1 -> 前文 2 -> 部署可视化界面 1 -> 前文 【DeepSeek】DeepSeek概述 | 本地部署deepseek 通过前文可以将deepseek部署到本地使用&#xff0c;可是每次都需要winR输入cmd调出命令行进入到命令模式&#xff0c;输入命令ollama run deepseek-r1:latest。体验很…...

【Git版本控制器】:第一弹——Git初识,Git安装,创建本地仓库,初始化本地仓库,配置config用户名,邮箱信息

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ 相关笔记&#xff1a; https://blog.csdn.net/dj…...

Fabric.js、leaferjs、pixi.js 库的对比分析

文章目录 一、引言二、参与对比的 canvas 库简介三、性能对比四、易用性对比五、功能特性对比六、综合评价与使用建议七、总结 在前端开发中&#xff0c;canvas 库为实现丰富的图形效果和交互功能提供了强大的支持。本文将对 Fabric.js、leaferjs 和 pixi.js 这三个常见的 canv…...

JVM——堆的回收:引用计数发和可达性分析法、五种对象引用

目录 引用计数法和可达性分析法 引用计数法&#xff1a; 可达性分析算法&#xff1a; 五种对象引用 软引用&#xff1a; 弱引用&#xff1a; 引用计数法和可达性分析法 引用计数法&#xff1a; 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&…...

2.11 sqlite3数据库【数据库的相关操作指令、函数】

练习&#xff1a; 将 epoll 服务器 客户端拿来用 客户端&#xff1a;写一个界面&#xff0c;里面有注册登录 服务器&#xff1a;处理注册和登录逻辑&#xff0c;注册的话将注册的账号密码写入数据库&#xff0c;登录的话查询数据库中是否存在账号&#xff0c;并验证密码是否正确…...

开源模型应用落地-Qwen1.5-MoE-A2.7B-Chat与vllm实现推理加速的正确姿势(一)

一、前言 在人工智能技术蓬勃发展的当下,大语言模型的性能与应用不断突破边界,为我们带来前所未有的体验。Qwen1.5-MoE-A2.7B-Chat 作为一款备受瞩目的大语言模型,以其独特的架构和强大的能力,在自然语言处理领域崭露头角。而 vllm 作为高效的推理库,为模型的部署与推理提…...

相得益彰,Mendix AI connector 秒连DeepSeek ,实现研发制造域场景

在当今快速发展的科技领域&#xff0c;低代码一体化平台已成为企业数字化转型的关键工具&#xff0c;同时&#xff0c;大型语言模型&#xff08;LLM&#xff09;如 DeepSeek 在自动生成代码和提供智能建议方面表现出色。 Mendix 于近期发布的 GenAI 万能连接器&#xff0c;目前…...

英语笔记【一】词性

一、be 动词 be 动词&#xff0c;是英语中的一种词汇用法&#xff0c;一般用来表示“是”的意思&#xff0c;也可表示“成为”的意思。 be动词的用法有多种变化形式。英语的句子必有一个动词。be 动词自然也是动词的一种。 am 用于第一人称单数&#xff1b;is 第三人称单数&a…...

同为科技智能PDU助力Deepseek人工智能和数据交互的快速发展

1 2025开年&#xff0c;人工智能领域迎来了一场前所未有的变革。Deepseek成为代表“东方力量”的开年王炸&#xff0c;不仅在国内掀起了技术热潮&#xff0c;并且在全球范围内引起了高度关注。Deepseek以颠覆性技术突破和现象级应用场景席卷全球&#xff0c;这不仅重塑了产业格…...

.NET Web-静态文件访问目录浏览

一、Web根目录访问 创建wwwroot文件夹app.UseStaticFiles(); // 启⽤静态⽂件中间件url/路径 进行访问 二、Web根目录之外的文件 app.UseStaticFiles(new StaticFileOptions {FileProvider new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRootPath,&qu…...

redis sentinel模式 与 redis 分片集群 配置

Redis 最低为5.0版本&#xff0c;以下为6.2.6版本信息。 模式 高可用性 数据分片 部署复杂度 适用场景 Sentinel 模式 高 无 中等 中小规模&#xff0c;需要高可用性 集群模式 高 支持 复杂 大规模&#xff0c;需要高…...

CentOS安装Docker,Ubuntu安装Docker,Docker解决方案

文章目录 CentOS7安装DockerUbuntu修改Docker镜像源docker设置容器自动启动启动时加--restartalways如果已经过运行的项目docker compose设置容器自启动 docker file修改时区docker在容器执行命令简单粗暴的办法安装curl docker compose命令安装docker compose Docker WEB 图形…...

【php】php json_encode($arr) 和 json_encode($arr, 320) 有什么区别?

在 PHP 中&#xff0c;json_encode() 函数用于将 PHP 变量&#xff08;通常是数组或对象&#xff09;编码为 JSON 格式的字符串。json_encode($arr) 和 json_encode($arr, 320) 的区别主要在于第二个参数&#xff0c;该参数是一个由多个 JSON_* 常量按位或&#xff08;|&#x…...