news 2026/5/12 3:40:03

前缀和,线段树,树状数组,ST表四种数据结构的辨析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前缀和,线段树,树状数组,ST表四种数据结构的辨析

前缀和主要用于解决区间求和,线段数组主要用于动态的区间统计,ST表主要用于查询区间最值,线段树主要用于查询动态的区间最值

主要公式:

pre[i] = pre[i-1] + g[i]; pre[i][j] = g[i][j] - pre[i-1][j-1] + pre[i-1][j] + pre[i][j-1]; S = pre[x2][y2] + pre[x1-1][y1-1] - pre[x1-1][y2] - pre[x2][y1-1];

树状数组主要公式:单体添加,动态范围查询

static int lowbit(int x){ return x & -x; } static void add(int x,int v){ while(x<=n){ tree[x] += v; x += lowbit(x); } } static int sum(int x){ int res = 0; while(x>0){ res += tree[x]; x -= lowbit(x); } return res; }

注:一般范围查询就用sum(r) - sum(l-1);

ST表:主要用于静态范围查询最值,举个模版题

import java.util.*; import java.io.*; public class Main{ static int n; static int [] a; static int [][] st; static int [] log; public static void main(String[] args)throws Exception{ BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer stt = new StringTokenizer(bf.readLine()); n = Integer.parseInt(stt.nextToken()); int m = Integer.parseInt(stt.nextToken()); a = new int [n+1]; st = new int [n+1][20]; log = new int[n+1]; stt = new StringTokenizer(bf.readLine()); for(int i=1;i<=n;i++){ a[i] = Integer.parseInt(stt.nextToken()); st[i][0] = a[i]; } for(int i=2;i<=n;i++){ log[i] = log[i>>1] + 1; } for(int j=1;j<=log[n];j++){ for(int i=1;i+(1<<j)-1<=n;i++){ st[i][j] = Math.max(st[i][j-1],st[i+(1<<(j-1))][j-1]); } } StringBuilder sb = new StringBuilder(); while(m-->0){ stt = new StringTokenizer(bf.readLine()); int L = Integer.parseInt(stt.nextToken()); int R = Integer.parseInt(stt.nextToken()); int k = log[R-L+1]; int ans = Math.max(st[L][k],st[R-(1<<k)+1][k]); sb.append(ans).append("\n"); } System.out.print(sb.toString()); } }

注意两个地方:一个就是固定公式st[i][j] = Math.max(st[i][j-1],st[i+(1<<(j-1))][j-1]);

int ans = Math.max(st[L][k],st[R-(1<<k)+1][k]);

还有就是这题求的是最大值,如果要求最小值的话,把两个max换成min就可以了

离散化:数据很大又很乱时,但是你只关心数据的大小关系,而算法只需要下标时就可以用,举个例子:

import java.io.*; import java.util.*; public class Main { static int n; static int[] h; // 身高(离散化后是排名) static int[] tree; // 树状数组 // lowbit static int lowbit(int x) { return x & -x; } // 树状数组:单点加 1 static void add(int x, int v) { while (x <= n) { tree[x] += v; x += lowbit(x); } } // 树状数组:前缀和 static int sum(int x) { int res = 0; while (x > 0) { res += tree[x]; x -= lowbit(x); } return res; } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); h = new int[n]; for (int i = 0; i < n; i++) { h[i] = Integer.parseInt(br.readLine()); } // ====================== //离散化 // ====================== int[] b = h.clone(); Arrays.sort(b); // 去重 int m = 0; for (int i = 0; i < n; i++) { if (i == 0 || b[i] != b[i - 1]) { b[m++] = b[i]; } } // 映射为排名(1-based) for (int i = 0; i < n; i++) { h[i] = Arrays.binarySearch(b, 0, m, h[i]) + 1; } // ====================== //树状数组统计逆序对 // ====================== tree = new int[n + 1]; long ans = 0; for (int i = 0; i < n; i++) { int x = h[i]; // 左边比它大的数量 ans += i - sum(x); // 当前元素加入 add(x, 1); } System.out.println(ans); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 0:36:43

收藏!ChatGPT爆发后,程序员必看的大模型入门指南

自ChatGPT掀起AI热潮以来&#xff0c;短短一年多时间&#xff0c;企业与个人对AI学习和应用的认知已完成革命性升级。最初的"尝鲜式"探索&#xff0c;如今早已转化为职场人提升核心竞争力的迫切需求——在这个AI重构行业规则的时代&#xff0c;掌握大模型相关技术不再…

作者头像 李华
网站建设 2026/5/11 19:45:54

私有化部署LobeChat满足等保三级要求的路径

私有化部署LobeChat满足等保三级要求的路径 在金融、政务和医疗等行业&#xff0c;数据安全早已不再是“锦上添花”的附加项&#xff0c;而是系统上线前必须跨过的门槛。随着大语言模型&#xff08;LLM&#xff09;逐步进入企业核心业务流程——从智能客服到内部知识问答&#…

作者头像 李华
网站建设 2026/5/11 10:21:30

Java毕设项目:基于JavaWeb的智慧养老院管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/5 8:40:03

Rk3588鲁班猫4点亮led

Rk3588鲁班猫4点亮led这里只上代码&#xff0c;先执行sudo sh -c echo 0 > /sys/class/leds/sys_status_led/brightness关闭自带一直闪烁的led。随后编译下面代码得到.ko文件并加载到板卡。Makefile文件可以看我上一篇博客的末尾。#include <linux/init.h>#include &l…

作者头像 李华
网站建设 2026/5/12 22:32:40

生日祝福个性化:LobeChat记住每个人的喜好

生日祝福个性化&#xff1a;LobeChat 记住每个人的喜好 在快节奏的现代生活中&#xff0c;一句千篇一律的“生日快乐”往往显得轻飘。真正打动人心的&#xff0c;是那些藏在细节里的温暖&#xff1a;“还记得你最爱那家山脚下的咖啡馆吗&#xff1f;今天一定要去坐坐。”——这…

作者头像 李华
网站建设 2026/5/12 1:29:06

无需API限制!通过LobeChat镜像自由调用大模型Token

无需API限制&#xff01;通过LobeChat镜像自由调用大模型Token 在AI应用快速落地的今天&#xff0c;越来越多企业希望将大语言模型&#xff08;LLM&#xff09;集成到内部系统中。但现实往往令人沮丧&#xff1a;OpenAI等主流服务不仅有严格的API调用频率限制&#xff0c;还存在…

作者头像 李华