前面先给大家讲一下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语言描述)相关推荐

  1. 归并排序详解(Java语言描述 萌新向)

    目录 一,归并排序简介 二,归并排序原理 三,归并排序图解 1,归并总体的图解 2,合并两个子组的流程 3,归并排序动画演示 四,归并排序代码实现与分析(Java) 1,方法的合集 2,Merge类各 ...

  2. 图之邻接表详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 四.测试 结语 附录 一.定义 图的邻接表是一种顺序与链式存储相结合的存储方式.下面给出一个示例,以便大家能够理解邻接表这种存储方式:         无向 ...

  3. 线性表详解(静态链表、单链表、双向链表、循环链表)

    目录 申明 1. 线性表的定义 2. 线性表的抽象数据类型 3. 线性表的顺序存储结构 3. 1 顺序存储定义 3. 2 顺序存储方式 3. 3 数据长度与线性表长度区别 3. 4 地址计算方法 4. ...

  4. DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)

    DZ各个数据表详解(DZ论坛各表详细说明,二次开发用) DZ默认库的53个数据表 cdb_access (用户权限表) uid 用户id fid 论坛id allowview 允许浏览 allowpo ...

  5. #转载:杨辉三角形实现过程详解-c语言基础

    杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...

  6. 判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 其实这些 ...

  7. DBus glib 各数据类型接收与发送详解—C语言(3)

    DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...

  8. mysql 用户管理表_Mysql—用户表详解(mysql.user)

    MySQL 数据库 Mysql-用户表详解(mysql.user) MySQL是一个多用户管理的数据库,可以为不同用户分配不同的权限,分为root用户和普通用户,root用户为超级管理员,拥有所有权限 ...

  9. 资料 | O‘Reilly精品图书系列:算法精解 C 语言描述 (简体中文)

    下载地址:资料 | O'Reilly精品图书系列:算法精解 C 语言描述 (简体中文) 内容简介 · · · · · · 本书是数据结构和算法领域的经典之作,十余年来,畅销不衰! 全书共分为三部分:第 ...

最新文章

  1. 【Android 应用开发】BluetoothDevice详解
  2. 华表 单元格公式设定与计算
  3. 【机器学习基础】深入讨论机器学习 8 大回归模型的基本原理以及差异!
  4. 选择排序之小白学算法
  5. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]
  6. WPF系列 自定控件
  7. LINQ能不能用系列(一)LINQ to Object 效率比对
  8. 关于MQTT、HTTP、WebService
  9. python12-并发编程
  10. NTIRE @ CVPR 2021 视频质量增强竞赛:数据库、方法及结果汇总(官方发布)
  11. 牛客第三场多校 H Diff-prime Pairs
  12. grafna监控Java接口_性能测试之 JVM 的监控 Grafana
  13. idea中字体由繁体变简体
  14. 【ENVI遥感影像分类】 监督、非监督分类
  15. 如何为水晶报表rpt文件添加数据连接
  16. mysql的填充因子_确定SQL Server填充因子(FILLFACTOR)值的方法
  17. 另一个视角看春节红包大战,为什么说智能云是百度第二增长引擎
  18. larval-admin
  19. mysql 百亿数据_从SQL Server到MySQL,近百亿数据量迁移实战
  20. 聚名网:.io域名属于什么类型的域名?有哪些魅力?

热门文章

  1. 基于Multisim的红路灯电路设计
  2. 软件设计师 UML建模大题
  3. bat 切换网络适配器_Windows批处理自动切换IP地址设置无线网络和以太网的IP地址...
  4. 苹果cms模板_苹果CMS建站的一些心得
  5. 大学英语六级历年真题Word,PDF,和音频 下载
  6. plantuml样式_PlantUML之活动图
  7. python opencv 利用HSV,YUV(YCbCr)实现皮肤检测与抠图,与磨皮美颜
  8. linux系统怎么设置ftp账号密码错误,linux系统FTP设置账号密码
  9. inventor2五子棋游戏apk_五子棋大师2中文版游戏
  10. 安卓一键清理内存_安卓的手机内存清理来啦……