如何高效计算向量多个切片的和?适配的数据结构是什么?
最优解:前缀和数组(Prefix Sum Array)
这题太典型了!针对你这种有百万级元素的向量,且需要频繁查询任意切片元素总和的场景,前缀和数组绝对是最适合的数据结构,刚好能通过复用计算结果解决重复遍历的问题。
核心思路(动态规划思想)
我们先预先构建一个前缀和数组prefix,其中每个元素prefix[i]代表原向量v从起始位置到第i-1位的元素总和(索引从0开始)。构建规则很简单:
prefix[0] = 0(基准值,代表空区间的和)- 对于
i >= 1,prefix[i] = prefix[i-1] + v[i-1]
这样一来,所有前面的计算结果都被存储起来,后续查询直接复用即可。
如何快速计算切片和
假设你要查询切片v[a..b](这里按你例子里的左闭右开区间理解,比如v[500_000..750_000]表示从索引500000到749999的元素),那么总和可以直接通过公式计算:
sum(v[a..b]) = prefix[b] - prefix[a]
拿你举的例子来说:
- 计算
v[500_000..750_000]的和:prefix[750000] - prefix[500000] - 计算
v[400_000..600_000]的和:prefix[600000] - prefix[400000]
两个查询完全独立,且都只需要O(1)的时间复杂度,彻底避免了重复遍历重叠区间的问题。
优缺点分析
- ✅ 优点:构建前缀和数组只需要O(n)的时间,每次查询都是O(1),空间复杂度O(n)——对于百万级元素来说,内存开销完全可控(比如存储百万个int类型元素仅需约4MB)。
- ❌ 局限性:如果原向量需要频繁修改元素值,前缀和数组的维护成本会很高(需要重新构建或批量更新)。这种场景下可以考虑线段树或树状数组,但如果只是静态查询,前缀和数组是最简洁高效的选择。
内容的提问来源于stack exchange,提问作者Gabriel Machado
相关产品推荐
相关产品推荐

