news 2026/7/2 2:43:25

前缀和,线段树,树状数组,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/7/1 16:44:09

大数据项目:Python音乐数据采集分析可视化系统 网易云音乐数据 分析大屏 Flask框架 (附源码+文档)计算机毕业设计 建议收藏✅

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

作者头像 李华
网站建设 2026/6/29 5:13:15

Netcode for GameObjects Boss Room 多人RPG战斗(9)

Unity Boss Room 战斗流程分析 一、战斗系统架构概述 Boss Room项目采用服务器权威的战斗系统架构,确保所有战斗计算和状态同步的一致性。战斗流程主要由以下核心组件构成: 动作系统:基于Action基类的通用动作框架,支持近战、远程、AOE等多种战斗动作 伤害系统:通过IDam…

作者头像 李华
网站建设 2026/7/1 14:28:05

Dubbo 面试必问:默认序列化框架及你知道的选择!

文章目录 默认使用什么序列化框架&#xff0c;你知道的还有哪些&#xff1f;引言第一部分&#xff1a;什么是序列化&#xff1f;第二部分&#xff1a;Dubbo 的默认序列化框架——Hessian1. 为什么选择 Hessian&#xff1f;2. Hessian 的配置 第三部分&#xff1a;你知道的还有哪…

作者头像 李华
网站建设 2026/7/1 0:28:29

中小微企业做企业微信社群有必要买AI SCRM吗?最新实践总结

一、2025年中小微企业社群运营的三个现实困境2025年&#xff0c;企业微信已连接超1400万真实企业与7.5亿微信用户&#xff0c;成为中小微企业私域运营的核心阵地。但看社群运营背后藏着三个难以忽视的痛点&#xff0c;制约着企业的运营效率与发展潜力。其一&#xff0c;人力成本…

作者头像 李华