ST表 详解(C语言描述)
前面先给大家讲一下ST表的基础原理
ST表是一种常用算法,用于快速求区间的最值,当要大量计算区间最值时,使用ST表可以节省时间。
其复杂度为NlogN, 普通算法为N*N,缺点是不能在线修改值,(还有一种算法叫线段树可以,以后会讲)
ST[ i ][ j ] 的值为区间[ i, i + 2^j) 的最值,注意区间为左闭右开;
利用动态规划思想,区间[ i, i + 2^j) 的最值为 区间[ i, i + 2^(j - 1) ) 和
区间[ i + 2^(j - 1) ,i + 2^(j - 1)+ 2^(j - 1) ) ( 即 区间[ i + 2^(j - 1) ,i + 2^j ) 的最值,
因此推出 状态转移方程 ST[i][j+1] = max( ST[i][j] , ST[i + ( 1 << j)][j]); 1 << j 等于 2^j
下面即我写的代码,为了构造Find 函数, 我加入了一个数组mn[ ], log n, 但是当其值不为整数时向下取整。
写这个数组时我用了一些比较有意思的代码,大家可以仔细分析一下。
其实ST表中最重要的是这个算法的思想,只要大家掌握了思想就可以写出自己个性的代码
#include<stdio.h>
#define max(a,b) ( a > b ? a:b) // max函数
int ST[100][100];
int mn[100];
int a[100];
int main(void) // ST[i][j] 表里储存的是区间 [ i,i+2^j ) 里的最值,注意区间是左闭右开
{
int Find(int L,int R);
void Creat(int N);
int i;
int N = 10; // 初始化数组的大小,也可以通过键盘输入
for( i = 0; i < N; i++)
{
a[ i ] = i * 3; // 初始化数组,也可以通过键盘输入,这里为了更简单一点
}
Creat(N);
printf("%8d",Find(0,5));
return 0;
}
void Creat(int N)
{
int i,j;
mn[0] = -1;
for( i = 0; i < N; i++)
{
ST[i][0] = a[i]; // 初始化ST表
mn[i+1] = ( ( (i+1) & i ) == 0 ) ? mn[i] + 1 : mn[i] ; // 初始化mn数
// mn数组里储存的是2^n 中的n,如果不恰好等于整数,向下取整
}
for( j =0; (1 << j )<= N; j++) // 处理ST表,这里为了简单求的是区间的最大值,也可以求其他最值
{
for( i =0; i < N; i++) // (1 << j) 等于 2 的 j 次方
{
ST[i][j+1] = max( ST[i][j] , ST[i + ( 1 << j)][j]); // 状态转移方程,区间(i,i+2^j)的最值为
} // 区间(i,i+2^(j-1))和区间(i+2^(j-1),i+2^j)的最值
}
}
int Find(int L,int R) // 求区间[L,R]的最值函数
{
int L_num = L;
int R_num = R;
int k = mn[R-L]; // 利用mn数组求出区间最多可以分成多少个n, 2^n = 区间长度
return max(ST[L][k],ST[ R-(1<<k) + 1][ k ]) ; // 比较两个相交区间求出目标区间的最值
} // +1 是为了是左闭右开区间 变成左闭右闭
ST表 详解(C语言描述)相关推荐
- 归并排序详解(Java语言描述 萌新向)
目录 一,归并排序简介 二,归并排序原理 三,归并排序图解 1,归并总体的图解 2,合并两个子组的流程 3,归并排序动画演示 四,归并排序代码实现与分析(Java) 1,方法的合集 2,Merge类各 ...
- 图之邻接表详解(C语言版)
文章目录 一.定义 二.结构 三.常用操作 四.测试 结语 附录 一.定义 图的邻接表是一种顺序与链式存储相结合的存储方式.下面给出一个示例,以便大家能够理解邻接表这种存储方式: 无向 ...
- 线性表详解(静态链表、单链表、双向链表、循环链表)
目录 申明 1. 线性表的定义 2. 线性表的抽象数据类型 3. 线性表的顺序存储结构 3. 1 顺序存储定义 3. 2 顺序存储方式 3. 3 数据长度与线性表长度区别 3. 4 地址计算方法 4. ...
- DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)
DZ各个数据表详解(DZ论坛各表详细说明,二次开发用) DZ默认库的53个数据表 cdb_access (用户权限表) uid 用户id fid 论坛id allowview 允许浏览 allowpo ...
- #转载:杨辉三角形实现过程详解-c语言基础
杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...
- 判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...
算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 其实这些 ...
- DBus glib 各数据类型接收与发送详解—C语言(3)
DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...
- mysql 用户管理表_Mysql—用户表详解(mysql.user)
MySQL 数据库 Mysql-用户表详解(mysql.user) MySQL是一个多用户管理的数据库,可以为不同用户分配不同的权限,分为root用户和普通用户,root用户为超级管理员,拥有所有权限 ...
- 资料 | O‘Reilly精品图书系列:算法精解 C 语言描述 (简体中文)
下载地址:资料 | O'Reilly精品图书系列:算法精解 C 语言描述 (简体中文) 内容简介 · · · · · · 本书是数据结构和算法领域的经典之作,十余年来,畅销不衰! 全书共分为三部分:第 ...
最新文章
- 【Android 应用开发】BluetoothDevice详解
- 华表 单元格公式设定与计算
- 【机器学习基础】深入讨论机器学习 8 大回归模型的基本原理以及差异!
- 选择排序之小白学算法
- [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]
- WPF系列 自定控件
- LINQ能不能用系列(一)LINQ to Object 效率比对
- 关于MQTT、HTTP、WebService
- python12-并发编程
- NTIRE @ CVPR 2021 视频质量增强竞赛:数据库、方法及结果汇总(官方发布)
- 牛客第三场多校 H Diff-prime Pairs
- grafna监控Java接口_性能测试之 JVM 的监控 Grafana
- idea中字体由繁体变简体
- 【ENVI遥感影像分类】 监督、非监督分类
- 如何为水晶报表rpt文件添加数据连接
- mysql的填充因子_确定SQL Server填充因子(FILLFACTOR)值的方法
- 另一个视角看春节红包大战,为什么说智能云是百度第二增长引擎
- larval-admin
- mysql 百亿数据_从SQL Server到MySQL,近百亿数据量迁移实战
- 聚名网:.io域名属于什么类型的域名?有哪些魅力?
热门文章
- 基于Multisim的红路灯电路设计
- 软件设计师 UML建模大题
- bat 切换网络适配器_Windows批处理自动切换IP地址设置无线网络和以太网的IP地址...
- 苹果cms模板_苹果CMS建站的一些心得
- 大学英语六级历年真题Word,PDF,和音频 下载
- plantuml样式_PlantUML之活动图
- python opencv 利用HSV,YUV(YCbCr)实现皮肤检测与抠图,与磨皮美颜
- linux系统怎么设置ftp账号密码错误,linux系统FTP设置账号密码
- inventor2五子棋游戏apk_五子棋大师2中文版游戏
- 安卓一键清理内存_安卓的手机内存清理来啦……