zoukankan      html  css  js  c++  java
  • ST算法

    ST算法

    ST算法是一种用于解决RMQ(Range Minimum/Maximum Query,即区间最值查询)问题的离线算法,类似于线段树和树状数组的,其功能特性差不多,当实现起来的话,显然是ST算法更为简便。

    ST算法的时间复杂度:预处理的是O(nlogn),查询的是O(1);

    ST表的主体式一个二维数组dp[i][j],第一个状态表示需要需要查询区间的首元素,第二个状态表示从首元素开始向后延伸的长度。

    在查询的时候,你输入的区间不一定总是2的倍数,那么查询的时候便会出现区间重复查询,但是这并不影响最后的结果,也不会影响时间复杂度。

    例如:我输入的区间是(3,11),那么我计算出来的k = (int)(log(double(r - l + 1)) / log(2.0)),即k = 3。那么我便会在区间(3,10)和(4,11)这两个区间中去最小值返回。其中重复的区间是(4,10)。

    下面就是有一份简单的求区间最小值代码:

    其题意是:输入n个数,以及m次查询,每次查询输入l,r,表示区间的左右边界,求区间的最小值。

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    
    int a[1005]; 
    int dp[1005][20];    //该st算法的两种状态:
                         //   第一个表示当前区间首元素的位置
                         //    第二个状态从当前区间首元素开始,延伸的长度
    
    void ST_init(int n) {
        for(int i = 0; i < n; i++) {
            dp[i][0] = a[i];    //初始化区间长度为1时的值
        }
        int nlen = (int)(log((double)(n)) / log(2.0));    //计算区间可倍增区间的最大次方
        for(int j = 1; j <= nlen; j++) {    
            for(int i = 0; i < n; i++) {
                dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]); //将当前区间分成两个子区间求其最小值
            }
        }
    }
    
    int ST_query(int l, int r) {
        int k = (int)(log(double(r - l + 1)) / log(2.0));    //找到当前区间最大的倍增长度
        return min(dp[l][k], dp[r - (1 << k) + 1][k]);    
    }
    
    int main() {
        int n, m;
        cin >> n >> m;
        for(int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        ST_init(n);
        while(m--) {
            int l, r;
            cin >> l >> r;
            cout << ST_query(l, r) << endl;
        }
        return 0;
    }
  • 相关阅读:
    NSString 字符串处理:截取字符串、匹配字符串、分隔字符串
    iOS项目开发需要导进的常用第三方库
    iOS---防止UIButton重复点击的三种实现方式
    Xcode9 不使用数据线真机调试
    修改Xcode新建类的注释模板(作者,公司名等)
    【源码】tableView刷新指定的cell 或section和滚动到指定的位置
    【源码】tableViewcell页码
    ios如何在一个控制器中添加另一个控制器
    把本地项目提交到coding上
    deinit
  • 原文地址:https://www.cnblogs.com/buhuiflydepig/p/11212282.html
Copyright © 2011-2022 走看看