滑动窗口

剑指offer--滑动窗口的最大值

我的未来我决定 提交于 2019-11-28 07:15:55
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。 /* 题目:滑动窗口的最大值 思路:滑动窗口应当是队列,但为了得到滑动窗口的最大值,队列序可以从两端删除元素,因此使用双端队列。 原则: 对新来的元素k,将其与双端队列中的元素相比较 1)前面比k小的,直接移出队列(因为不再可能成为后面滑动窗口的最大值了!), 2)前面比k大的X,比较两者下标,判断X是否已不在窗口之内,不在了,直接移出队列 队列的第一个元素是滑动窗口中的最大值 */ class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> res; deque<int> s; for(unsigned

【单调队列】--滑动窗口

我的未来我决定 提交于 2019-11-27 21:54:34
题目链接 给定一个大小为 n ≤ 10 6 n≤106的数组。 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。 您只能在窗口中看到k个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为[1 3 -1 -3 5 3 6 7],k为3。 窗口位置 最小值 最大值 [1 3 -1] -3 5 3 6 7 -1 3 1 [3 -1 -3] 5 3 6 7 -3 3 1 3 [-1 -3 5] 3 6 7 -3 5 1 3 -1 [-3 5 3] 6 7 -3 5 1 3 -1 -3 [5 3 6] 7 3 6 1 3 -1 -3 5 [3 6 7] 3 7 您的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。 输入格式 输入包含两行。 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长度。 第二行有n个整数,代表数组的具体数值。 同行数据之间用空格隔开。 输出格式 输出包含两个。 第一行输出,从左至右,每个位置滑动窗口中的最小值。 第二行输出,从左至右,每个位置滑动窗口中的最大值。 输入样例: 8 3 1 3 -1 -3 5 3 6 7 输出样例: -1 -3 -3 -3 3 3 3 3 5 5 6 7思路:首先想暴力的做法,时间复杂度是O(n*k),然后再来看是否可以优化的地方。以输窗口最小值为例:可以发现,在一个窗口中,如果来了一个小的数

TCP-IP之滑动窗口

允我心安 提交于 2019-11-27 19:48:04
前言 TCP在OSI七层模型中,属于第四层(传输层),帮我们处理了传输层的细节。包括限流、丢包、网络传输乱序等问题。那TCP到底是如何实现限流的呢? 如果你需要复习一下基础知识,请戳这里《TCP/IP基础十分钟入门》 ,博主比较懒,下周补上 接收端缓冲区被塞满 如果sender发送速度快,reciever处理速度慢。会发生什么事? 过一段时间,reciever的缓冲区被打满。 当reciever缓冲区被打满后,通过ack(win=0)告诉sender不要给我发送数据了,我处理不了了。 sender就会停止发送数据。 过一会,reciever处理数据后,缓冲区有了空闲空间。 通过ack声明自己的窗口大小 sender继续发送数据 滑动窗口出场 通过动画我们可以直观的看到窗口向右滑动,所以叫做滑动窗口。 分解动作 滑动前 图示都包含哪些信息呢?我们分解来看。 接收端的窗口大小为6 窗口外,左侧为已经发送且已经收到ack,这部分数据可以丢弃了。 12-14为已经发送,但未收到ack。(不能丢弃,有可能需要重发) 15-17为未发送数据,由于未确认数据小于6,所以可以很快发送 窗口外,右侧为未发送数据,但由于窗口已满,不能发送 滑动后 sender收到ack=12的确认包 窗口向右滑动 窗口内的数据改为13-18 总结 以上就是TCP/IP中的滑动窗口。 滑动窗口也是服务限流的一种算法。

滑动窗口

会有一股神秘感。 提交于 2019-11-27 12:50:22
一、以字节为单位的滑动窗口 假定从A收到B发来的确认报文段,窗口大小是20(字节),确认号是31(表名B期望收到的下一序号是31,而序号30为止的数据已经收到了)。根据这两个数据,A就构造出自己的发送窗口,位置如下: A的发送窗口表示:在没有收到B的确认的情况下,A可以连续吧窗口内的数据都发送出去。 凡是已经发送过得数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。 发送窗口里面的序号表示允许发送的序号,显然窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据;发窗口后沿后边的部分表示已发送且已收到确认;发送窗口前沿的前面部分表示不允许发送的,因为接收方没有为这部分数据保留临时存放的缓存空间。 发送窗口的位置由窗口前沿和后沿的位置共同确定。 发送窗口后沿的变化有两种情况: 不动(没有收到新的确认)和前移(收到了新的确认) ,发送窗口后沿不可能向后移动,因为不能撤销掉已收到的确认。 发送窗口前沿通常是不断向前移动,但也有可能不动。对应于两种情况:一是没有收到新的确认,对方通知的窗口大小也不变;二是收到新的确认,但对方通知的窗口缩小了,使得发送窗口前沿正好不动。 二、利用滑动窗口实现流量控制 所谓流量控制就是让发送方发送的速率不要太快,要让接收方来得及接收。 利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。在连接建立时

[洛谷 1886] 滑动窗口

倾然丶 夕夏残阳落幕 提交于 2019-11-27 12:30:45
---恢复内容开始--- 一道经典的单调队列题目 单调指的是元素的规律呈现为一种单调性,递增,递减,或者自定义 队列指的是只能从队首和队尾进行操作(所以单调队列也可以用STL的deque实现),但单调队列只需要队首的弹出、队尾的插入和弹出 题目的要求是每连续k个数中的最大值和最小值,以维护最大值为例,对于任意在范围内,且在 ---恢复内容结束--- ### 一道经典的单调队列题目 单调指的是元素的规律呈现为一种单调性,递增,递减,或者自定义1576249-20190816123042323-327652433.png 队列指的是只能从队首和队尾进行操作(所以单调队列也可以用STL的deque实现),但单调队列只需要队首的弹出、队尾的插入和弹出 题目的要求是每连续k个数中的最大值和最小值,以维护最大值为例,对于任意在范围内,且在队列中的数x,y,新进队一个数z,z > x && z > y,那么z从队尾进队,x,y出队 Code: #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; const int maxn = 1000100; int n, k; int q[maxn], a[maxn]; void getmin() { int head

Luogu-P1886 滑动窗口

眉间皱痕 提交于 2019-11-27 10:19:51
题目 题目链接 测试得分:  100 主要算法 :  单调队列优化DP 题干:   单调队列优化DP板子 分析   单调队列优化DP定长连续区间最值问题   代码 #include<stdio.h> #include<stdlib.h> #define FORa(i,s,e) for(int i=s;i<=e;i++) #define FORs(i,s,e) for(int i=s;i>=e;i--) #define gc getchar()//pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),stdin)?EOF:*pa++ #define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout); using namespace std; char buf[100000],*pa,*pb; inline int read(); const int N=1e6,K=1e6; int n,k,a[N+1]; int head,tail,num[K+1],q[N+1]; /*单调队列,num[]记录的是单调队列中元素在输入数据中的编号,q代表的是元素在输入数据中的值*/ void Solve_Min() { head=1,tail=0; FORa(i,1,n

算法:滑动窗口

荒凉一梦 提交于 2019-11-27 10:01:06
滑动窗口 1.什么是滑动窗口 滑动窗口是一个队列, 2)先移动右指针, 3)当满足条件时,移动左指针,直到不满足条件, 4)重复2,3步,直到右指针到末位。 leetcode 3.无重复字符的最长子串 class Solution { public: int lengthOfLongestSubstring(string s) { if(s.size() == 0) return 0; unordered_set<char> lookup; int maxStr = 0; int left = 0; for(int i = 0; i < s.size(); i++){ while (lookup.find(s[i]) != lookup.end()){ lookup.erase(s[left]); left ++; } maxStr = max(maxStr,i-left+1); lookup.insert(s[i]); } return maxStr; } }; leetcode 76. 最小覆盖子串 class Solution { public: string minWindow(string s, string t) { int start=0,minlen=INT_MAX,left=0,right=0; unordered_map<char,int> window;

TCP/IP基础知识

霸气de小男生 提交于 2019-11-27 09:30:30
第一部分 TCP/IP 基础知识 TCP/IP分层及各层主要协议 数据链路层: SLIP 、 PPP 网络层: IP 、 ARP 、 RARP 、 ICMP 传输层: TCP 、 UDP 应用层: FTP 、 TELNET 、 SMTP 、 HTTP 、 TFTP ===================== 这部分与 宇航出版社 的《 Microsoft Windows NT4.0 环境下的 TCP/IP 网络互联》中的 第一、二章(除 ARP 外) 对应 首先我们这门课是 TCP/IP 在 Windows NT 中的应用,并不完全讲 TCP/IP 协议,所以有一些 TCP/IP 理论方面的知识并没有涉及到。在讲 TCP/IP 在 Windows NT 中的应用时,我们先回顾一下,在网络基础中讲到的网络的 OSI 模型,假如有同学从 TCP / IP 学起,此处作一个铺垫。 第一课 OSI 模型 (open system interface) OSI 模型最初是用来作为开发 网络通信协议族 的一个 工业参考标准 。通过严格遵守 OSI 模型, 不同的网络技术 之间可以轻易地实现互操作。 应用层 Application Layer 表示层 Present Layer 会话层 Semission Layer 传输层 Transport Layer 网络层 Internet Layer

滑动窗口-洛谷T1866(单调队列)

久未见 提交于 2019-11-27 09:23:36
咕咕咕 单调队列板子题 一、基本 1.单调队列: 特殊的双端队列,内部元素。分为最大队列(单调递增)和最小队列(单调递减)两种 二、应用 本题中:大部分单调队列优化的动态规划问题都和定长连续子区间的最值问题 #include<bits/stdc++.h> using namespace std; inline int read() { int sum = 0,p = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') p = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { (sum *= 10) += ch - '0'; ch = getchar(); } return sum * p; } const int N = 1e6 + 5; int n,k,head,tail; int a[N],fn[N],fx[N],num[N],q[N]; void dpmin() { head = 1,tail = 0; for(int i = 1;i <= n;i++) { while(num[head] < i - k + 1 && head <= tail) head++; while(a[i] <= q[tail] && head <= tail

CF 1198 A. MP3 模拟+滑动窗口

人盡茶涼 提交于 2019-11-27 05:31:31
A. MP3 题意:给你n个数,一个大小为8*I的容量,保存一个数需要多少容量取决于给定n个数的种类k,用公式 log 2 k 计算,如果给定的容量不能保存所有数,选择减少数的种类来降低保存一个数需要的单位容量(通过替换来减少数的种类,数据的总量不变),问最少需要替换多少个数 题解:根据输入数据的关系,可以求得保存一个数需要得最小单位容量kk= 8*I / n; 又因为kk= log 2 k 可以解得在容量允许情况下,可以保存得最多数据种类k=2 kk 又因为输入数据个数得限制n<=4*10^5; 即2 kk <=4*10^5;解得kk最小等于20; 所以当kk>=20得时候,一定可以把数据完全保存----------剪枝处理 当kk<20的时候: 由kk= log 2 k 解得数据种类k=2^kk (快速幂) 因为要替换的个数最少,肯定是优先替换只出现过一次的数据, 滑动窗口处理[0,k-1]:   用一个大小为k的窗口去判断在窗口内的要替换的最小个数 #include<iostream> #include<algorithm> #include<math.h> #include<string> #include<string.h> #include<vector> #include<utility> #include<map> #include<queue> #include