跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

算法进阶:一维前缀和原理与实战

讲解一维前缀和算法,用于快速计算数组区间和。通过预处理构建前缀和数组,将查询复杂度从 O(N) 降至 O(1),整体时间复杂度优化至 O(N+M)。对比暴力解法,展示其在多次查询场景下的性能优势,并提供 C++ 实现示例。

锁机制发布于 2026/3/29更新于 2026/10/2593 浏览
算法进阶:一维前缀和原理与实战

问题背景

在算法竞赛和实际开发中,我们经常遇到需要频繁查询数组区间和的场景。如果直接遍历求和,效率往往难以满足要求。今天我们来聊聊如何高效解决这类问题——一维前缀和。

核心思路

前缀和的本质是空间换时间。通过预处理,将多次区间查询的时间复杂度从 $O(N)$ 降低到 $O(1)$。

为什么不用暴力?

假设数组长度为 $N$,查询次数为 $m$。暴力解法每次遍历区间,总复杂度约为 $O(m \times N)$。当 $N$ 和 $m$ 都达到 $10^5$ 级别时,运算量高达 $10^{10}$,必然超时。

前缀和怎么做?

我们需要构建一个辅助数组 dp,其中 dp[i] 表示原数组 arr 前 i 个元素的和。

  1. 预处理:创建一个大小为 $N+1$ 的数组。之所以多一位,是因为 dp[0] 设为 0,方便处理边界情况,避免下标越界。 递推公式:dp[i] = dp[i-1] + arr[i]
  2. 查询:对于区间 [l, r],其和等于 dp[r] - dp[l-1]。

代码实现

下面是一个标准的 C++ 实现示例,展示了如何构建前缀和数组并进行查询。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 初始化数组
    int n = 5;
    vector<int> arr = {1, 2, 3, 4, 5};
    
    // 构建前缀和数组,大小为 n+1
    vector<int> dp(n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        dp[i] = dp[i - 1] + arr[i - 1];
    }

    // 查询区间 [1, 3] 的和
     l = , r = ;
     sum = dp[r] - dp[l - ];
    cout <<  << l <<  << r <<  << sum << endl;

     ;
}
int
1
3
int
1
"区间 ["
", "
"] 的和为:"
return
0

复杂度分析

  • 预处理阶段:遍历一次数组,时间复杂度 $O(N)$。
  • 查询阶段:每次查询常数时间,$m$ 次查询总耗时 $O(m)$。
  • 整体复杂度:$O(N + m)$,相比暴力解法的 $O(m \times N)$ 有显著提升。

总结

前缀和是处理静态数组区间和问题的利器。掌握这一技巧,能让你的代码在处理大规模数据时更加从容。后续我们会继续探讨二维前缀和及其他变体应用。

目录

  1. 问题背景
  2. 核心思路
  3. 为什么不用暴力?
  4. 前缀和怎么做?
  5. 代码实现
  6. 复杂度分析
  7. 总结

更多推荐文章

查看全部
  • OpenClaw 结合 iMessage 私有 API 实现本地 AI 短信中枢
  • Linux 环境下 C/C++ 编译流程与链接机制详解
  • Halcon 20.11 安装避坑指南与 License 配置详解
  • 联邦学习实践:用 Llama Factory 在分布式数据上训练模型
  • 文心一言 4.5 开源模型部署实战与多场景应用解析
  • 漏洞扫描工具 AWVS 介绍及安装教程
  • iOS 设备运行 Minecraft Java 版指南
  • 基于 Web 的教师档案管理系统设计与实现
  • VsCode 远程 Copilot 调用 Claude Agent 提示“无效请求”的排查与修正
  • SSH 免密登录配置详解
  • Python 2.7 pip 9.0.1 安装与实战指南
  • 基于 Spring Boot 的上门帮厨管理系统设计与实现
  • 飞算 JavaAI 插件实战:从安装到智能编码全流程体验
  • OpenClaw 开源机械手重塑机器人抓取技术
  • AI 驱动 Web UI 自动化:Playwright + Robot Framework 实践
  • Agent Native 取代 Copilot:智能体重塑公司架构与组织
  • 基于 YOLOv8-v12 与 SpringBoot 的轴承缺陷检测系统
  • AI 绘画技术指南:提示词工程与创作流程解析
  • Java 项目目录结构文档自动化生成方案
  • Java 企业人事工资管理系统设计与实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online