zoukankan      html  css  js  c++  java
  • 单调队列

    单调队列的操作

    举例

    不妨用一个问题来说明单调队列的作用和操作:
    不断地向缓存数组里读入元素,也不时地去掉最老的元素,不定期的询问当前缓存数组里的最小的元素。
    最直接的方法:普通队列实现缓存数组。
    进队出队都是O(1),一次查询需要遍历当前队列的所有元素,故O(n)。

    用堆实现缓存数组

    堆顶始终是最小元素,故查询是O(1)。
    而进队出队,都要调整堆,是O(log(n))。

    RMQ的方法

    RMQ即Range Maximum(Minimum) Query,用来求某个区间内的最大值或最小值。使用线段树或稀疏表是O(log(n))级的。对于这类问题这两种方法也搞得定,但是没有单调队列快。

    单调队列的舞台

    由于单调队列的队头每次一定最小值,故查询为O(1)。
    进队出队稍微复杂点:
    进队时,将进队的元素为e,从队尾往前扫描,直到找到一个不大于e的元素d,将e放在d之后,舍弃e之后的所有元素;如果没有找到这样一个d,则将e放在队头(此时队列里只有这一个元素)。
    出队时,将出队的元素为e,从队头向后扫描,直到找到一个元素f比e后进队,舍弃f之前所有的。(实际操作中,由于是按序逐个出队,所以每次只需要出队只需要比较队头)。
    每个元素最多进队一次,出队一次,摊排分析下来仍然是 O(1)。
    上面的话可能还是没能讲出单调队列的核心:队列并不实际存在的,实际存在的是具有单调性的子序列。对这个子序列按心中的队列进行操作,譬如在进队时丢弃的元素,虽然它不存在于这个子序列里,但是还是认为他存在于队列里。
    另外,进队的顺序和出队的顺序并不一定相同,因为这个队列本身是隐含存在的,可以在进队时看成一个队列,出队时看成另一个队列,只要出队的元素在队列中就行。可以想象成一个队列只有头和身,另一个队列只有身和尾,而这身是共用的。
    在OI赛场上,大多数题目为单调队列力所不能及的,取而代之的是单调队列基础上改进的斜率优化,单调栈等,因为其限制条件,故潜力不大。但需要掌握,因为有许多算法建立在其基础上。
    例如斜率优化即为f[i] = min/max{f[j] + g[i] * g[j]},和单调队列尤为相似。
    单调栈即为单调队列的“栈”版。
    这两种复杂度也是O(n)的。

    在信息学竞赛的一些应用

    动态规划·单调队列的理解

    动态规划时常常会见到形如这样的转移方程:
    f[x] = max or min{g(k) | b[x] <= k < x} + w[x]
    (其中b[x]随x单调不降,即b[1]<=b[2]<=b[3]<=...<=b[n])
    (g[k]表示一个和k或f[k]有关的函数,w[x]表示一个和x有关的函数)
    这个方程怎样求解呢?我们注意到这样一个性质:如果存在两个数j, k,使得j <= k,而且g(k) <= g(j),则决策j是毫无用处的。因为根据b[x]单调的特性,如果j可以作为合法决策,那么k一定可以作为合法决策,并且k是一个比j要优的决策。因为k比j要优,(注意:在这个经典模型中,“优”是绝对的,是与当前正在计算的状态无关的),所以,如果把待决策表中的决策按照k排序的话,则g(k)必然是不降的。在此例中决策表即f[x].
    这样,就引导我们使用一个单调队列来维护决策表。对于每一个状态f(x)来说,计算过程分为以下几步:
    1、 队首元素出队,直到队首元素在给定的范围中。
    2、 此时,队首元素就是状态f(x)的最优决策,
    3、 计算g(x),并将其插入到单调队列的尾部,同时维持队列的单调性(不断地出队,直到队列单调为止)。
    重复上述步骤直到所有的函数值均被计算出来。不难看出这样的算法均摊时间复杂度是O(1)的。因此求解f(x)的时间复杂度从O(n^2)降到了O(n)。
    单调队列指一个队列中的所有的数符合单调性(单调增或单调减),在信息学竞赛的一些题目上应用,会减少时间复杂度
  • 相关阅读:
    索引信息统计
    删除脚本
    归档脚本
    SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
    用js输出同样字符出现的次数
    grid布局
    统计字符出现的次数
    百度地图
    For each...in,For...in ,For...of的Examples和Explanation
    Object的起源
  • 原文地址:https://www.cnblogs.com/FuTaimeng/p/5422891.html
Copyright © 2011-2022 走看看