热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法学习ST表稀疏表解决RMQ问题

2017-08-2621:44:45writer:pprpRMQ问题就是区间最大最小值查询问题;这个SparseTable算法构造一个表,

2017-08-26 21:44:45

writer:pprp

RMQ问题就是区间最大最小值查询问题;

这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j -1]的最大或者最小值

ST分为两个部分

1、nlogn的预处理

预处理主要用到了动态规划,二分区间每个区间长度为 2 ^ (j -1)找到一个递推关系;

F[i][j] &#61; min(F[i][j - 1],F[i &#43; (1 <<(j - 1))][j - 1]);

2、查询部分更为巧O(1)得到询问结果

对于任意一个区间【n,m】来说&#xff0c;可以将其划分为两个以上区间的和

【m,n】 &#61; 【m, m&#43;2^k-1】 &#43; 【n-2^k-1,n】

其中k &#61; log2(n-m&#43;1)

实现的代码如下&#xff1a;

/*
&#64;theme:ST表&#xff08;sparse table&#xff09;稀疏表
&#64;writer:pprp
&#64;declare:用动态规划的思想来解决RMQ问题&#xff1b;
&#64;date:2017/8/26
*//*方程
F[i,j]:区间[i,i &#43; 2^j - 1]的最小值&#xff0c;此时区间长度为2^j
转移方程&#xff1a;F[i,j] &#61; min(F[i,j - 1],F[i &#43; 2^(j - 1),j - 1])
初始化&#xff1a;F[i,0] &#61; nArr[i];
*/#include using namespace std;int F[1000000][20];//待比较元素的个数最大为1百万void SparseTable(int a[], int len)
{
//初始化for(int i &#61; 0 ; i )F[i][
0] &#61; a[i];//递推//找到j的范围log2(n)int nlog &#61; int(log(double(len))/log(2.0));for(int j &#61; 1 ; j <&#61; nlog; j&#43;&#43;){for(int i &#61; 0 ; i ){//区间右端点不能超过数组最后一位下标if((i &#43; (1 <1) < len ){F[i][j] &#61; min(F[i][j - 1],F[i &#43; (1 <<(j - 1))][j - 1]);}}}
}
int RMQ(int a[], int len, int Start, int End)
{
//中间变量的选取log2(len)int nlog &#61; (int)(log(double(End-Start&#43;1))/log(2.0));return min(F[Start][nlog], F[End - (1 <1][nlog]);
}
int main()
{
int a[] &#61; {2,34,2,3,23,2,23,1,23,123,23,232,3,25,565,76};for(int i &#61; 0 ; i <16 ; i&#43;&#43;){cout <" ";}cout << endl;SparseTable(a,16);int l, r;while(cin >> l >> r){cout <16,l,r) << endl;}return 0;
}

 ST模板

#include using namespace std;int F[1000000][20];
void ST(int a[],int len)
{
for(int i &#61; 0 ; i )F[i][0] &#61; a[i];int nlog &#61; int(log(double(len))/log(2.0));for(int j &#61; 1; j <&#61; nlog; j&#43;&#43;){for(int i &#61; 0 ; i ){if(i&#43;(1<1 < len)F[i][j] &#61; max(F[i][j-1],F[i&#43;(1<<(j-1))][j-1]);}}
}
int RMQ(int a[],int len, int l, int r)
{
int nlog &#61; floor(log(double(r-l&#43;1))/log(2.0));return max((F[l][nlog]),F[r-(1<1][nlog]);
}
int main()
{
int a[10000];int n;cin >> n;for(int i &#61; 0 ; i )cin >> a[i];ST(a,n);int l,r;int cas;cin >> cas;while(cas--){cin >> l >> r;cout < endl;}return 0;
}

 

转:https://www.cnblogs.com/pprp/p/7436498.html



推荐阅读
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • hlg_oj_1116_选美大赛这题是最长子序列,然后再求出路径就可以了。开始写的比较乱,用数组什么的,后来用了指针就好办了。现在把代码贴 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • 本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • Go从入门到精通系列视频之go编程语言密码学哈希算法(二) ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • 本文探讨了如何高效地计算数组中和为2的幂的偶对数量,提供了从基础到优化的方法。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本问题涉及在给定的无向图中寻找一个至少包含三个节点的环,该环上的节点不重复,并且环上所有边的长度之和最小。目标是找到并输出这个最小环的具体方案。 ... [详细]
  • 深入解析WebP图片格式及其应用
    随着互联网技术的发展,无论是PC端还是移动端,图片数据流量占据了很大比重。尤其在高分辨率屏幕普及的背景下,如何在保证图片质量的同时减少文件大小,成为了亟待解决的问题。本文将详细介绍Google推出的WebP图片格式,探讨其在实际项目中的应用及优化策略。 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
author-avatar
炜一爱妮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有