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

前缀和算法原理详解

综述由AI生成前缀和是一种高效的区间查询优化技术,通过预处理将单次查询复杂度从 O(n) 降至 O(1)。其核心逻辑是利用 dp[i] = dp[i-1] + arr[i] 构建累积和数组,再通过 dp[r] - dp[l-1] 快速得出区间结果。结合 Java 代码演示了具体实现,重点讲解了状态转移过程及防止溢出的注意事项,适用于高频区间求和场景。

beaabea发布于 2026/3/27更新于 2026/6/1223 浏览
前缀和算法原理详解

文章配图

文章配图

一、问题背景

在处理数组区间查询时,如果我们需要频繁计算某一段连续元素的和(例如从第 l 个到第 r 个元素),直接遍历求和的时间复杂度是 O(n)。当查询次数 m 很大时,总耗时可能达到 O(n*m),这在数据量较大(如 n, m ≤ 10^5)时会超时。

输入描述: 第一行包含两个整数 n, m (1 ≤ n, m ≤ 10^5),分别代表数组长度和查询次数。 第二行包含 n 个整数 a_1, a_2, ..., a_n (-10^9 ≤ a_i ≤ 10^9)。 随后 m 行,每行包含两个整数 l, r (1 ≤ l ≤ r ≤ n),表示一次查询。

输出描述: 对于每次查询,输出区间 [l, r] 的和。

示例: 输入:

3 2
1 2 4
1 2
2 3

输出:

3
6

二、算法原理

前缀和本质上是一种动态规划思想的简化应用。它的核心在于预处理,将重复计算转化为常数时间的查询。

1. 状态定义

我们定义一个前缀和数组 dp,其中 dp[i] 表示原数组中从第 1 个元素到第 i 个元素的累加和。

2. 状态转移

递推公式非常简单:

dp[i] = dp[i - 1] + arr[i]

这意味着,当前位置的前缀和等于'上一个位置的前缀和'加上'当前元素的值'。通过这种方式,我们只需要遍历一次数组,就能构建出整个前缀和表。

3. 区间查询优化

有了前缀和数组,计算任意区间 [l, r] 的和就变得异常简单。根据容斥原理:

Sum(l, r) = dp[r] - dp[l - 1]

这样,每次查询的时间复杂度降为 O(1),整体复杂度优化为 O(n + m)。

注意: 在实际开发中,如果数组元素较大或累加次数多,前缀和数组建议使用 long 类型存储,防止整数溢出。

三、代码实现

下面是一个标准的 Java 实现示例。为了处理 1-based 索引的查询方便,我们在读取数组时通常从下标 1 开始填充。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        
        // 读取数组长度 n 和查询次数 m
        int n = in.nextInt();
        int m = in.nextInt();
        
        // 使用 long 类型防止累加溢出
        // 下标从 1 开始,方便处理 l-1 的情况
        long[] dp = new long[n + 1];
        
        // 构建前缀和数组
        for (int i = 1; i <= n; i++) {
            int val = in.nextInt();
            dp[i] = dp[i - 1] + val;
        }
        
        // 处理 m 次查询
        while (m-- > 0) {
            int l = in.nextInt();
            int r = in.nextInt();
            
            // 利用前缀和公式 O(1) 计算区间和
            System.out.println(dp[r] - dp[l - 1]);
        }
        
        in.close();
    }
}

四、实战细节

  1. 边界处理:注意题目中的索引是从 1 开始还是 0 开始。上述代码适配了常见的 1-based 输入,如果是 0-based 数组,公式需调整为 dp[r+1] - dp[l]。
  2. 数据类型:当单个元素接近 10^9 且 n 达到 10^5 时,总和可能超过 2^31-1,务必使用 long。
  3. 输入效率:在极端大数据量下(如 n=10^6),Scanner 可能会变慢,此时可考虑使用 BufferedReader 和 StringTokenizer。

通过这种预处理方式,原本需要大量循环的计算被压缩成了简单的减法运算,这就是前缀和算法的魅力所在。

目录

  1. 一、问题背景
  2. 二、算法原理
  3. 1. 状态定义
  4. 2. 状态转移
  5. 3. 区间查询优化
  6. 三、代码实现
  7. 四、实战细节
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • SLAM 与室内绝对定位融合:终结机器人导航漂移
  • 鸿蒙 Flutter 智能家居应用开发实战指南
  • Java 助力充电桩物联网与新能源深度融合
  • Stable Diffusion 的 3 个主流替代方案
  • iceoryx 附录:C++ 内存模型与原子操作详解
  • MySQL 用户权限配置与 C/C++ 客户端连接实战
  • AI 驱动 PDF 文档智能解析:MinerU 本地部署与 API 调用
  • 扩散模型原理与图像生成实战
  • Python 爬取财富中国 500 强数据示例
  • Claude 官方 Skill-Creator:AI 技能工程化完整体系解析
  • 基于 KSWEB 在安卓手机部署 Typecho 博客并配置外网访问
  • 人工智能学习指南:从基础语法到大模型实战
  • 多模态大模型:开启通用人工智能新篇章
  • 免费 AI 大模型 API 汇总及国内大模型使用教程
  • AI 领域为何全面转向 AI Agent 方向?
  • Llama 3:Meta 新一代开源大语言模型详解
  • 国内大模型公司面试经历与技术复盘
  • 人工智能产品经理:AI 时代的产品经理进阶手册
  • AI 大模型开发必备书籍推荐:从入门到实战
  • AI 大模型工程师成长路径:从零基础到就业

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

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

  • Gemini 图片去水印

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