前缀和是针对静态数组的预处理策略,将区间求和查询从o(n)降至o(1),适用于查询频次远超数组长度的场景;需用length+1数组实现、防边界错误,并可扩展至二维。

前缀和不是“加法加速器”,而是把重复计算提前做完的预处理策略。它不改变单次查询逻辑,但让高频查询从“每次重算”变成“查表相减”,响应时间从毫秒级降到纳秒级。
明确适用前提:数组静态 + 查询密集
前缀和只在以下条件同时满足时效果显著:
- 原始数组在整个业务周期内基本不更新(或更新极少)
- 同一份数据被反复用于区间求和类查询(如统计某时段订单总额、某区域用户活跃度、某时间窗口内请求量)
- 查询次数远大于数组长度(例如:10万次查询作用于1万元素数组)
一旦数组频繁变动(比如每秒增删改),前缀和需反复重建,反而拖慢整体性能——此时应考虑树状数组或线段树。
正确构建前缀和数组:多开一位防边界错误
推荐统一使用 length + 1 长度的 prefix 数组,定义为:
prefix[i] = nums[0] + nums[1] + … + nums[i−1],即 prefix[0] = 0。
这样所有区间 [l, r](0-indexed 闭区间)的和都可统一写成:
prefix[r + 1] − prefix[l]
Python 示例:
nums = [1, 3, 2, 5, 4]
prefix = [0] * (len(nums) + 1)
for i in range(len(nums)):
prefix[i + 1] = prefix[i] + nums[i]
# prefix = [0, 1, 4, 6, 11, 15]
<h1>查询 [1, 3] → nums[1]+nums[2]+nums[3] = 3+2+5 = 10</h1><p>print(prefix[4] - prefix[1]) # 11 - 1 = 10 ✅</p>嵌入业务系统的关键实践点
- 初始化阶段完成预处理:在服务启动或数据加载时一次性构建 prefix,避免运行时临时计算
- 查询接口直用差值公式:不封装冗余逻辑,直接 return prefix[r+1] - prefix[l],减少函数调用开销
- 注意数据类型溢出:若 nums 元素较大或长度超 10⁵,prefix 应用 long 或 int64 类型(Python 中自动适配,Java/C++ 需显式声明)
- 配合批量 IO 提升吞吐:如接收 m 组 [l,r] 查询,先读全再逐个计算并批量返回,避免多次系统调用
不止一维:二维场景同样高效
当业务涉及矩阵型数据(如热力图、用户行为网格、库存分布表),二维前缀和可将区域求和从 O(行×列) 降至 O(1):
- 定义 prefix2d[i][j] = 左上角 (0,0) 到 (i−1,j−1) 子矩阵元素和
- 查询矩形 [(r1,c1), (r2,c2)] 和 = prefix2d[r2+1][c2+1] − prefix2d[r1][c2+1] − prefix2d[r2+1][c1] + prefix2d[r1][c1]
- 典型应用:实时报表中“近7天华东区各城市日均下单量”这类交叉维度聚合










