一维前缀和与二维前缀和算法介绍及使用

一维前缀和与二维前缀和算法介绍及使用

目录

1. 一维前缀和

1.1 一维前缀和原理讲解

1.2 具体代码实现以及例题讲解

2. 二维前缀和

2.1 二维前缀和原理讲解

2.2 具体代码实现以及例题讲解


今天我们来聊聊一维前缀和算法,这个算法属于基础算法。

1. 一维前缀和

一维前缀和是一种高效处理数组区间求和问题的算法,通过预处理数组构建前缀和数组,能将区间和查询的时间复杂度从 O (n) 降至 O (1)。

简单来说它的本质就是预处理,在这一点上有点像字符串的KMP算法,都是通过预处理的方式来换取效率。

这种算法是专门用来处理多次求区间和问题的。

1.1 一维前缀和原理讲解

那么我们该怎么进行预处理呢,我们看下面这张图,下面那个表格就是我们的前缀和数组,一般来说我们使用vector来存储前缀和数组。

我们的前缀和数组的第0个位置一般来说都是直接置空的,这个的话是因为我们在代码实现的时候要通过前缀和数组前一个位置的值加原数据当前位置的值来确定前缀和当前位置的值,如果我们不给第一个位置放0的话,在代码实现的时候我们还需要进行特判,这个的话比较麻烦,而直接置空的话就没有这个问题了,所以我们一般是选择直接置空。

然后如果我们要求具体的某一段区间和的话,那么就要把结尾位置的值减去区间开头位置-1的值。

之所以要-1是因为区间开头的位置也是我们所需要的,所以-1后的位置才是具体要去掉的。

1.2 具体代码实现以及例题讲解

接下来我们通过一道例题,带大家理解前缀和的预处理方式。

我们看下面这张图片,题目给了一串数据然后要求我们的代码可以按要求连续求出要求查询的区间和。不要看现在好像就这么一点点数据,如果这个n无限变大的情况下,暴力的解法就肯定会超时的,

我们看下面这个代码,第二个for循环的作用就是构造一维前缀和数组,然后那个while循环里面的话就是计算出具体的区间和。

#include<iostream> #include<vector> using namespace std; int main() { int n; int m; cin>>n>>m; vector<long long> nums(n+1); vector<long long> dp(n+1); for(int i=1;i<=n;++i) cin>>nums[i]; for(int i=1;i<=n;++i) dp[i]=dp[i-1]+nums[i]; while(m--) { int l,r; cin>>l>>r; long long sum=dp[r]-dp[l-1]; cout<<sum<<endl; } return 0; }

2. 二维前缀和

二维前缀和是一维前缀和在二维矩阵场景下的扩展,专门用于高效计算矩阵中任意子矩形区域的元素总和。它通过预处理构建前缀和矩阵,将单次子区域和的查询时间优化到 O (1),非常适合需要频繁查询二维区域和的场景。

简单来说它就是在一维的基础上加了一维。同样,它也专门用来处理二维区间求和问题的。

2.1 二维前缀和原理讲解

二维前缀和的预处理和一维的有一点不一样的地方。那就是它在创建前缀和数组时需要减去重复加的地方,而在计算某一段区间和的时候想要加上被重复减去的部分。

我们看下面这个表格,如果我们的前缀和数组想要[i][j]位置的值,也就是拿到ABCD,那么就要一块一块的拿,我们先拿AB的位置,也就是[]i-1[j],然后我们再拿AC的位置,也就是[i][j-1],然后在加上原数据中的[i][j]位置,最后我们发现A这个位置被重复加了两次,所以我们要减去A位置,也就是减去[i-1][j-1]。这样我们的二维前缀和数组就构建好了。

然后如果我们要算出具体的某一段的前缀。以D位置为例子,那么我们应该用总的减去部分,ABCD先减去AB再减去AC,最后我们在加上A那么我们就拿到了我们想要的D区域。

2.2 具体代码实现以及例题讲解

我们来看下面这道题,接下来我们通过这道题来详细的解释一下二维前缀和的原理。

我们来看下面这个代码,第二个双层for循环来创建二维前缀和数组。接下来在while循环里面通过减去不要的部分来得到我们想要的区间和。

PS:之所以要a-1和b-1是因为a和b也是我们想要的部分,不可以被减去。所以最后加上的区域是[a-1][b-1]。

#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int n,m,q; cin>>n>>m>>q; vector<vector<ll>> nums(n+1, vector<ll>(m+1)); vector<vector<ll>> dp(n+1, vector<ll>(m+1)); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) cin>>nums[i][j]; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) dp[i][j]=dp[i-1][j]+dp[i][j-1]+nums[i][j]-dp[i-1][j-1]; while(q--) { int a,b,c,d; cin>>a>>b>>c>>d; ll mysum=dp[c][d]-dp[a-1][d]-dp[c][b-1]+dp[a-1][b-1]; cout<<mysum<<endl; } return 0; }

Read more

【AI深究】随机森林(Random Forest)全网最详细全流程详解与案例(附Python代码演示)|集成学习|数学原理、案例流程、代码演示及结果解读|参数与调优、工程启示、单棵决策树的对比、优缺点

【AI深究】随机森林(Random Forest)全网最详细全流程详解与案例(附Python代码演示)|集成学习|数学原理、案例流程、代码演示及结果解读|参数与调优、工程启示、单棵决策树的对比、优缺点

大家好,我是爱酱。本篇将会系统地讲解随机森林(Random Forest)的原理、核心思想、数学表达、算法流程、代码实现与工程应用。内容适合初学者和进阶读者,配合公式和可视化示例。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力! 注:随机森林(Random Forest)与决策树(Decision Tree)息息相关,因此不了解决策树的同学建议先去了解一下,爱酱也有文章深入探讨决策树,这里也给上链接。 传送门: 【AI深究】决策树(Decision Tree)全网最详细全流程详解与案例(附Python代码演示)|数学原理、案例流程、代码演示及结果解读|ID3、C4.5、CART算法|工程启示、分类、回归决策树-ZEEKLOG博客 一、随机森林是什么?

By Ne0inhk

如何用Hunyuan-MT-7B-WEBUI解决民汉翻译难题?

如何用Hunyuan-MT-7B-WEBUI解决民汉翻译难题? 在新疆、西藏、内蒙古、广西、云南等多民族聚居地区,基层政务、教育、医疗、司法一线每天产生大量需要双向转换的文本:村委公告要译成维吾尔语张贴在社区公告栏,藏语病历需转为汉语供上级医院会诊,哈萨克语政策解读材料要同步生成汉语简明版下发……这些不是“锦上添花”的需求,而是关乎信息可达性、服务公平性与治理有效性的刚性要求。 传统机器翻译工具常在此类场景中失能——要么不支持少数民族语言,要么仅支持单向翻译(汉→民),要么输出生硬拗口、术语错乱、文化失当。而 Hunyuan-MT-7B-WEBUI 的出现,第一次让“高质量、低门槛、可部署”的民汉互译能力真正下沉到县乡一级的技术人员手中。它不是又一个云端API调用接口,而是一套开箱即用、本地运行、无需代码基础的完整推理环境。 更重要的是,它专为真实语境而生:支持藏语、维吾尔语、哈萨克语、蒙古语、彝语五大民族语言与中文之间的双向互译,且全部基于真实平行语料微调,而非简单语言对齐或零样本迁移。这意味着,你输入一句“请于本周五前提交年度帮扶计划表”

By Ne0inhk

Android WebView 版本升级方案详解

Android WebView 版本升级方案详解 目录 1. 问题背景 2. WebViewUpgrade 项目介绍 3. 升级方法详解 4. 替代方案对比 5. 接入与使用步骤 6. 注意事项与限制 7. 总结与建议 问题背景 WebView 版本差异带来的问题 Android 5.0 以后,WebView 升级需要去 Google Play 安装 APK,但即使安装了也不一定能正常工作。像华为、Amazon 等特殊机型的 WebView 的 Chromium 版本一般比较低,只能使用它自己的 WebView,无法使用 Google 的 WebView。 典型问题场景 H.265 视频播放问题:

By Ne0inhk
【前端】HTTP请求方式:GET、POST 与其他请求方法详解

【前端】HTTP请求方式:GET、POST 与其他请求方法详解

文章目录 * * 前言 * 定义概念 + 缩写 * 一、HTTP 是什么? * 二、常见请求方式 * 性质 * 一、GET 请求 * 特点 * 示例 * 适用场景 * 二、POST 请求 * 特点 * 示例 * 适用场景 * 三、PUT 请求 * 特点 * 示例 * 四、PATCH 请求 * 特点 * 五、DELETE 请求 * 特点 * 六、GET 与 POST 核心区别总结 * 使用步骤 * 一、在 Axios 中的标准写法 * 统一写法(推荐) * 二、什么时候用 GET?

By Ne0inhk