当前位置: 首页 > news >正文

【入门级-算法-4、算法策略:前缀和】

1、前缀和的概念
是一种预处理数据的算法策略,核心是提前计算数组中“从起始位置到每个位置的元素和”,大幅提升效率。

2、核心思想
前缀和是一种预处理技术,是预先计算并存储数组从起始位置到每个位置的元素累加和,从而将区间求和的复杂度从 O(n) 降为 O(1)。它的本质是用 “空间换时间”,通过一次预处理存储中间结果,避免后续重复计算,特别适合需要频繁查询数组区间和的场景。

3、基本定义
一个已经存在的数组 nums[0…n-1],我们定义它的前缀和数组 为: prefix[0…n]
数组prefix[0…n]来保存数组 nums[0…n-1]中元素的和
prefix[0] = 0 (或者 prefix[0] = nums[0],根据约定不同)
prefix[i] = nums[0] + nums[1] + … + nums[i-1]
更常见的定义(包含空集,便于计算):
prefix[0] = 0
prefix[1] = nums[0]
prefix[2] = nums[0] + nums[1]

prefix[i] = nums[0] + nums[1] + … + nums[i-1]

4、为什么需要前缀和?
假设有一个数组,我们需要频繁地查询某个区间 [L, R] 内元素的和。
传统方法:每次查询都遍历区间 [L, R] 进行累加。
时间复杂度:O(n) 每次查询
如果有 m 次查询,总复杂度:O(m × n),当 m 和 n 很大时效率极低。
前缀和方法:
预处理:花费 O(n) 时间构建前缀和数组。
每次查询:只需要 O(1) 时间计算。
m 次查询总复杂度:O(n + m),效率极大提升。

应用场景总结
频繁区间求和:统计任意区间的和、平均值等
子数组问题:寻找和为k的子数组、最大子数组和等
二维区域计算:图像处理、矩阵统计
配合哈希表:解决更复杂的子数组问题
实时数据分析:需要快速响应区间查询的系统

5、举例说明
假设有数组:nums = [2, 5, 1, 3, 4]
索引: 0 1 2 3 4
nums: [2, 5, 1, 3, 4]

构建前缀和数组:prefix[6]
prefix[0] = 0
prefix[1] = 0 + 2 = 2
prefix[2] = 2 + 5 = 7
prefix[3] = 7 + 1 = 8
prefix[4] = 8 + 3 = 11
prefix[5] = 11 + 4 = 15

前缀和数组: prefix = [0, 2, 7, 8, 11, 15]

代码实现
#include <stdio.h>
#include <stdlib.h>
// 构建前缀和数组
void build_prefix_sum(int nums[], int n, long long prefix[]) {
prefix[0] = 0;
for (int i = 1; i <= n; i++) {
prefix[i] = prefix[i - 1] + nums[i - 1];
}
}
// 查询区间和 [L, R](0-indexed)
long long query_range_sum(int L, int R, long long prefix[]) {
return prefix[R + 1] - prefix[L];
}
// 打印数组
void print_array(char* name, long long arr[], int size) {
printf(“%s: [”, name);
for (int i = 0; i < size; i++) {
printf(“%lld”, arr[i]);
if (i < size - 1) printf(“, “);
}
printf(”]\n”);
}
int main() {
int nums[] = {2, 5, 1, 3, 4};
int n = sizeof(nums) / sizeof(nums[0]);

// 前缀和数组(长度比原数组多1)
long long* prefix = (long long*)malloc((n + 1) * sizeof(long long));
// 构建前缀和
build_prefix_sum(nums, n, prefix);
printf("原始数组: ");
for (int i = 0; i < n; i++) {printf("%d ", nums[i]);
}
printf("\n");
print_array("前缀和数组", prefix, n + 1);
// 测试查询
printf("\n区间和查询:\n");
printf("sum(1, 3) = %lld\n", query_range_sum(1, 3, prefix)); // 5+1+3=9
printf("sum(0, 4) = %lld\n", query_range_sum(0, 4, prefix)); // 2+5+1+3+4=15
printf("sum(2, 2) = %lld\n", query_range_sum(2, 2, prefix)); // 1
free(prefix);
return 0;

}

http://www.dtcms.com/a/495651.html

相关文章:

  • 在NVIDIA Jetson Orin NX (Ubuntu 22.04, JetPack 5.1, CUDA 11 cuDnn8) 上安装PyTorch 2
  • 权重2的网站网址大全免费网站
  • 上海开发网站寻找五屏网站建设
  • 写好 React useEffect 的终极指南
  • 「日拱一码」121 多组学因素分析MOFA
  • Bootstrap 多媒体对象
  • 茶叶网站规划河南省建设工程招标投标协会网站
  • Bootstrap 输入框组
  • 做国内电影网站赚钱不一个空间能放几个网站
  • 带高度多边形,生成3D建筑模型,支持多种颜色或纹理的OBJ、GLTF、3DTiles格式
  • JSP 自定义标签
  • 高效压缩 PDF 文件大小(3 大实用的 Python 库)
  • yum安装的一些问题
  • 网站建设需要的资料库存管理
  • LangChain PromptTemplate 全解析:从模板化提示到智能链构
  • debug - MCUXpresso - 将NXP工程编译过程的所有命令行参数找出来
  • 基于MATLAB的多棵树分类器(随机森林)
  • 瑞芯微RK3588平台FFmpeg硬件编解码移植及性能测试实战攻略
  • 外贸做企业什么网站wordpress在线计算程序
  • 开发个网站开票名称是什么网站的策划分析
  • swift不同的语言环境使用不同的AppName,CFBundleDisplayName
  • php建站程序合肥网站建设讯息
  • 创建网站需要准备哪些资料广汉网站建设ghxhwl
  • SD comfy:教程1
  • 第三十六篇|东方国际学院的教育数据建模实践:首都圈日本语学校的费用结构、生源分布与治理参数分析
  • 保障数据采集稳定性:设计针对淘宝 API 的熔断、降级与重试机制
  • 物流公司网站方案wordpress 文章链接
  • 题解:P14063 [PO Final 2022] 海滩 / Badstrand
  • 虎扑的网站是用什么技术做的短视频推广
  • 潍坊 网站六安网站排名优化电话