news 2026/4/16 19:26:56

前缀和,线段树,树状数组,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/4/16 10:14:19

python停车位检测识别系统 YOLO模型 PyQt5界面 openCV模块 Tensorflow框架 Torch框架 深度学习 计算机毕业设计

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…

作者头像 李华
网站建设 2026/4/16 10:14:18

git rebase

是什么 git rebase “把当前分支整个搬家&#xff0c;插到另一条分支的最新提交后面”&#xff0c;让历史看起来是一条直线&#xff0c;没有分叉。 图解 初始状态&#xff08;feature 从 master 的 B 开出&#xff0c;又多了 C、D&#xff1b;master 那边又走了 E、F&#xff…

作者头像 李华
网站建设 2026/4/16 10:17:20

大数据项目:Spark电影数据分析可视化系统 大数据 Hadoop 机器学习预测算法 爬虫 电影推荐 票房预测 猫眼电影 计算机毕业设计(全套源码+教程+开发笔记+文档)✅

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…

作者头像 李华
网站建设 2026/4/16 10:55:18

玉溪天水风动凿岩机行情含历史数据与优惠详情

在当前凿岩设备市场中&#xff0c;低价竞争频现&#xff0c;部分产品虽标价诱人&#xff0c;却因材质缩水、工艺粗糙导致故障率高、维护成本攀升&#xff0c;最终造成用户实际支出远超预期。这种“表面便宜、实则昂贵”的现象&#xff0c;已成为行业普遍痛点。面对这一现状&…

作者头像 李华