[其他ST产品] ST(Spare Table稀疏表)

[复制链接]
 楼主| gaonaiweng 发表于 2023-4-21 23:28 | 显示全部楼层 |阅读模式
ST(Spare Table稀疏表)算法采用了倍增思想,在O(nlogn)时间构造一个二维表,可以在O(1)时间在线查询[l,r]区间的最值,有效解决在校RMQ(Range Minimum/Maximum Query,区间最值查询)问题。
如何实现呢?
设F[i,j]表示[i,2j -1]区间的最值,区间长度为2j 。

603936442ab7bef67d.png

根据倍增思想,长度为2j 的区间可分成两个长度为2j-1 的子区间的最值即可。递推公式:F[i,j]=max(F[i,j-1],F[i+2j-1 ,j-1])。


623796442ab8ec1a88.png

通过上面的讲解其实就是动态规划思想。

评论

———————————————— 版权声明:本文为CSDN博主「sunday_soft」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hwdn3000/article/details/127381783  发表于 2023-4-21 23:29
 楼主| gaonaiweng 发表于 2023-4-21 23:28 | 显示全部楼层
1、ST创建
若F[i,j]表示[i,i+2j -1]区间的最值,区间长度为2j ,则i和j的取值范围是多少呢?
若数组的长度为n,最大区间长度2k ≤n<2k+1 ,则k=log2 n 向下取整,比如n=8时k=3,n=10时k=3.
在程序中,k=log2(n),也可用通用表达方式k=log(n)/log(2),log()表示以e为底的自然对数。

算法代码:
  1. void ST_create(){
  2. for(int i=1;i<=n;i++)
  3.         F[i][0]=a[i];//表示[i,i]区间的最值,区间长度为2^0
  4. int k=log2(n);
  5. for(int j=1;j<=k;j++)
  6.         for(int i=1;i<=n-(1<<j)+1;i++)//n-2^j+1
  7.                 F[i][j]=max(F[i][j-1],F[i+(1<<(j-1))][j-1]);
  8. //j用来控制区间大小
  9. }
 楼主| gaonaiweng 发表于 2023-4-21 23:29 | 显示全部楼层
例如有10个元素a[1…10]={5,3,7,2,12,1,6,4,8,15},其查询最值的ST如下图所示。

F[i,j]表示[i,i+2j-1] 区间的最值,区间长度为2j

33506442abc450003.png
 楼主| gaonaiweng 发表于 2023-4-21 23:29 | 显示全部楼层
2、ST查询
若查询[l,r]区间的最值,则首先计算k的值,和前面的计算方法相同,区间长度为r-l+1,2k ≤r-l+1<2k+1 ,因此k=log2(r-l+1)。
若查询区间长度为大于等于2k且小于2k+1 ,则根据倍增思想,可以将查询区间分为两个查询区间,取两个区间的最值即可。两个区间分别从l向后的2k 个数及从r向前2k 个数。
 楼主| gaonaiweng 发表于 2023-4-21 23:29 | 显示全部楼层
算法代码:
  1. int ST_query(int l,int r)
  2. {
  3.         int k=lng2(r-l+1);
  4.         return max(F[l][k],F[r-(1<<2)+1][k]);
  5. }
公羊子丹 发表于 2024-6-6 07:01 | 显示全部楼层

在掌握对象的变化频度时是有效的
万图 发表于 2024-6-6 08:04 | 显示全部楼层

中断信号直接从各外部设备通知中断控制器
Uriah 发表于 2024-6-6 09:07 | 显示全部楼层

待向GPIO(通用I/O端口)的输入从0变为1时,程序可以一定的间隔来检查GPIO的状态
帛灿灿 发表于 2024-6-6 11:03 | 显示全部楼层

来自单 片机内部的定时器和GPIO、串行通信设备UART等外设机器的中断被称为外部设备中断
Bblythe 发表于 2024-6-6 12:06 | 显示全部楼层

定时器输出引脚的设定
周半梅 发表于 2024-6-6 14:02 | 显示全部楼层

中断产生于单片机内部和外部的各种设备
Pulitzer 发表于 2024-6-6 15:05 | 显示全部楼层

这样的设定只需在setup()中定义一次便能在整个程序中有效
童雨竹 发表于 2024-6-6 17:01 | 显示全部楼层

多次检查也会给单片机带来负荷,对功耗不利
Wordsworth 发表于 2024-6-6 18:04 | 显示全部楼层

在GR-SAKURA中,从IO30引脚到IO35引脚接收来自外部的中断信号
Clyde011 发表于 2024-6-6 19:07 | 显示全部楼层

一种了解状态变化的简单方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

811

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部