博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单调队列 笔记
阅读量:5898 次
发布时间:2019-06-19

本文共 1665 字,大约阅读时间需要 5 分钟。

很早看过这个东西,不过今天遇到一道题发现居然没有写笔记。。。这里补上吧。

以下是我从某个题的解题报告翻出来的。转载的别人的。。。。

以此为例:对于N=8,K=3,8个元素序列1 3 -1 -3 5 3 6 7,窗口大小为3,也就是要求出(1, 3, -1), (3, -1, -3), (-1, -3, 5), (-3, 5, 3), (5, 3, 6), (3, 6, 7)这6个序列中的最小值,结果简单,就是-1, -3, -3, -3, 3, 3. 

使用单调队列,首先要有一个数据结构

struct node {
 int seq, val; }

用于记录队列中的元素及其在输入序列中的顺序。队列的状态是这样维护的:

1: [0,  1] //队列空,[seq=0, val=1]入队
3: [0,  1], [1,  3] //3大于队尾元素,放在队尾
-1: [2, -1] //从队尾往前扫,-1小于每一个所有元素,于是把它们都T掉
-3: [3, -3] //-3把-1T掉
5: [3, -3], [4,  5] //入队尾
3: [3, -3], [5,  3] //把队尾的5T掉
6:            [5,  3], [6,  6] //队首元素seq=3太老了,T掉;6比3小,放在队尾
7: [5,  3], [6,  6], [7,  7] //入队尾
从以上的处理方法可以看出:最老的元素要么早就被T掉了,要么就是最小的元素(排在队首)。所以每次加入一个新元素的时候:
1. 把需要出队的队首元素T掉;
2. 把队尾大于或等于它的元素全部T掉,自己入队。

 

说白了就是是保证窗口的元素的value是从前往后是依次减小(增大)的。还有一个值就是当前value的position,也就是说窗口里所有元素 的position都必须跟当前待插入的元素的position的距离相差小于等于窗口的大小。(-_-! 说的好别扭)

 

今天补补模板吧。。。。

class Node {public:    int pos;    int val;    Node() {};    Node(int _a, int _b) : pos(_a), val(_b) {}};class Dequ{    Node deq[N];public:    void Get_Min(int ans[], int _num[], int n, int k) {        int i, head, tail;        head = tail = 0;        REP(i, n) {            if(head < tail && deq[head].pos <= i - k)   head++;            while(head < tail && deq[tail-1].val >= _num[i])    tail--;            deq[tail++] = Node(i, _num[i]);            ans[i] = deq[head].val;        }    }    void Get_Max(int ans[], int _num[], int n, int k) {        int i, head, tail;        head = tail = 0;        REP(i, n) {            if(head < tail && deq[head].pos <= i - k)   head++;            while(head < tail && deq[tail-1].val <= _num[i])    tail--;            deq[tail++] = Node(i, _num[i]);            ans[i] = deq[head].val;        }    }} Dequeue;

 

 

 

 

 

你可能感兴趣的文章
sql经典语句
查看>>
使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)
查看>>
第4周作业-面向对象设计与继承
查看>>
机器学习的原理
查看>>
flink watermark介绍
查看>>
[Flink原理介绍第四篇】:Flink的Checkpoint和Savepoint介绍
查看>>
mybatis学习之一 开发环境配置和接口编程
查看>>
Android Xutils 框架
查看>>
C#基础知识整理 基础知识(21) 委托(二)
查看>>
Android应用程序键盘(Keyboard)消息处理机制分析(16)
查看>>
Sysbench 0.5版安装配置
查看>>
统一沟通-技巧-11-Lync-联盟-无法-音频-远程桌面-传文件
查看>>
书摘—你不可不知的心理策略
查看>>
【博客话题】毕业——开始人生的艰苦历程
查看>>
2014.7.30-8.3日广大网友的提问解答(答问题的第2个工作周)
查看>>
Powershell管理系列(二十五)PowerShell操作之获取AD账号及邮箱信息
查看>>
Linux安装telnet
查看>>
【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物...
查看>>
openstack nova修改实例路径,虚拟磁盘路径
查看>>
java.sql.SQLException: Lock wait timeout exceeded --转
查看>>