滑动窗口

滑动窗口的最大值

落花浮王杯 提交于 2020-03-25 21:29:38
原文地址: https://www.jianshu.com/p/e9af38e066bf 时间限制:1秒 空间限制:32768K 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。 我的代码 class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> res; int siz=num.size(); if(siz<1 || size<1 || siz<size) return res; if(size==1) return num; deque<int> tmp; for(int i=0;i<size;i++){ while((!tmp.empty())&&(tmp

TCP的滑动窗口与拥塞窗口

五迷三道 提交于 2020-03-22 06:19:01
一、滑动窗口 滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。 对ACK的再认识,ack通常被理解为收到数据后给出的一个确认ACK,ACK包含两个非常重要的信息: 一是期望接收到的下一字节的序号n,该n代表接收方已经接收到了前n-1字节数据,此时如果接收方收到第n+1字节数据而不是第n字节数据,接收方是不会发送序号为n+2的ACK的。举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,但是接下来收到的是 2049-3072,它是不会发送确认号为3072的ACK,而依旧发送1025的ACK。 二是当前的窗口大小m,如此发送方在接收到ACK包含的这两个数据后就可以计算出还可以发送多少字节的数据给对方,假定当前发送方已发送到第x字节,则可以发送的字节数就是y=m-(x-n).这就是滑动窗口控制流量的基本原理. 滑动窗口协议如图所示: 在这个图中,我们将字节从1至11进行标号。接收方通告的窗口称为提出的窗口,它覆盖了从第4字节到第9字节的区域,表明接收方已经确认了包括第3字节在内的数据,且通告窗口大小为6。我们知道窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。当接收方确认数据后,这个滑动窗口不时地向右移动

滑动窗口循环移动接收数据

时间秒杀一切 提交于 2020-03-10 06:31:51
缓存区数据循环 缓存区循环读取数据,处理拆包和解包的网络字节流处理示例 取模运算,循环内存 recvLength += m_serialPort.Read(tcmsBuf, (checkIndex+recvLength)%tcmsBuf.Length, (checkIndex + recvLength<tcmsBuf.Length)? (tcmsBuf.Length - checkIndex - recvLength): (checkIndex- (checkIndex + recvLength) % tcmsBuf.Length)); //循环内存接收判断,缓存2倍接收数据,方便内存区域循环 if(Math.Abs(m_TimeWatch.ElapsedMilliseconds% PositionManager.IntervalTime) > PositionManager.IntervalTime) { string tcmsReceiveError = "TCMS接收数据超时"+ PositionManager.IntervalTime + "ms"; ControlLogOperator.Error(tcmsReceiveError); GlobalManager.PushMessage(DataType.FormLog, tcmsReceiveError); }

剑指offer 64.滑动窗口的最大值

為{幸葍}努か 提交于 2020-03-06 17:37:37
剑指offer 64.滑动窗口的最大值 题目 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。 思路 如果不考虑复杂度的话,直接加一个内循环重新搜索即可。 这里采用双端队列,可以在前后删除,插入的时候从后方比较,如果一个数比新的数小,那么直接删除,如果比新的数大,若超出范围就删除,未超出就无视。 代码 public ArrayList<Integer> maxInWindows(int[] num, int size) { ArrayList<Integer> ans = new ArrayList<>(); if (num == null) { return ans; } if (num.length < size || size < 1) { return ans; } LinkedList<Integer>

AcWing 154. 滑动窗口(模板)

 ̄綄美尐妖づ 提交于 2020-03-05 23:13:47
题目链接: 点击这里 常见模型:找出滑动窗口中的最大值/最小值 # include <iostream> # include <cstdio> # include <cstring> # include <algorithm> using namespace std ; const int N = 1e6 + 10 ; int q [ N ] ; //队列里存的是下标 int n , k , a [ N ] ; int main ( ) { scanf ( "%d%d" , & n , & k ) ; for ( int i = 0 ; i < n ; ++ i ) scanf ( "%d" , & a [ i ] ) ; int hh = 0 , tt = - 1 ; for ( int i = 0 ; i < n ; ++ i ) { if ( hh <= tt && i - k + 1 > q [ hh ] ) hh ++ ; while ( hh <= tt && a [ q [ tt ] ] >= a [ i ] ) tt -- ; q [ ++ tt ] = i ; //最小值可能是a[i],所以要先加入i再输出结果 if ( i >= k - 1 ) printf ( "%d " , a [ q [ hh ] ] ) ; } puts ( "" ) ; hh = 0

239. 滑动窗口最大值Leetcode

久未见 提交于 2020-03-05 01:38:01
239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 提示: 你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。 进阶: 你能在线性时间复杂度内解决此题吗? 分析 记录时机:遍历vector ,i >= k - 1时开始记录窗口中的最大值 获取窗口中的最大值方法: 维护一个严格递减的数据结构 循环[i , i + k) ,比较得出最大值 O(n) 采用方法二嵌套循环时间复杂度O(n 2 ) 因为我们只需要窗口中的最大值,严格递减的数据结构使用栈的特性,比当前遍历元素小的栈元素 出栈 ,然后将当前遍历元素 入栈 ,栈底为我们需要的最大值;在有序的数据结构中,随着窗口的移动,利用到队列的特性,当队首不在窗口中时,要把队首删除,维护有效的严格递减数据结构。双边队列deque满足上述栈和队列的所有能力,选用这个数据结构使问题简化,并降低时间复杂度为O(n)。 本题中,双边队列中可以存储数组下标,也可以存储数据元素。 C++实现 class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector

深度相机技术之三:原理揭秘之-双目立体视觉

元气小坏坏 提交于 2020-03-03 01:24:17
为什么非得用双目相机才能得到深度? 双目立体视觉深度相机的工作流程 双目立体视觉深度相机详细工作原理 理想双目相机成像模型 极线约束 图像矫正技术 基于滑动窗口的图像匹配 基于能量优化的图像匹配 双目立体视觉深度相机的优缺点 --------------------------------------------------- 基于双目立体视觉的深度相机类似人类的双眼,和基于TOF、结构光原理的深度相机不同,它不对外主动投射光源,完全依靠拍摄的两张图片(彩色RGB或者灰度图)来计算深度,因此有时候也被称为被动双目深度相机。比较知名的产品有STEROLABS 推出的 ZED 2K Stereo Camera和Point Grey 公司推出的 BumbleBee。 ZED 2K Stereo Camera 为什么非得用双目相机才能得到深度? 说到这里,有些读者会问啦:为什么非得用双目相机才能得到深度?我闭上一只眼只用一只眼来观察,也能知道哪个物体离我近哪个离我远啊!是不是说明单目相机也可以获得深度? 在此解答一下:首先,确实人通过一只眼也可以获得一定的深度信息,不过这背后其实有一些容易忽略的因素在起作用:一是因为人本身对所处的世界是非常了解的(先验知识),因而对日常物品的大小是有一个基本预判的(从小到大多年的视觉训练),根据近大远小的常识确实可以推断出图像中什么离我们远什么离我们近

滑动窗口算法

牧云@^-^@ 提交于 2020-02-28 10:45:56
概述 滑动窗口实现了TCP流控制。首先明确滑动窗口的范畴:TCP是双工的协议,会话的双方都可以同时接收和发送数据。TCP会话的双方都各自维护一个发送窗口和一个接收窗口。各自的接收窗口大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的发送窗口则要求取决于对端通告的接收窗口,要求相同。 滑动窗口解决的是流量控制的的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致。接收端的缓存传输数据给应用层,但这个过程不一定是即时的,如果发送速度太快,会出现接收端数据overflow,流量控制解决的是这个问题。 窗口的概念 发送方的发送缓存内的数据都可以被分为4类: 已发送,已收到ACK 已发送,未收到ACK 未发送,但允许发送 未发送,但不允许发送 其中类型2和3都属于发送窗口。 接收方的缓存数据分为3类: 已接收 未接收但准备接收 未接收而且不准备接收 其中类型2属于接收窗口。 窗口大小代表了设备一次能从对端处理多少数据,之后再传给应用层。缓存传给应用层的数据不能是乱序的,窗口机制保证了这一点。现实中,应用层可能无法立刻从缓存中读取数据。 滑动机制 发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界。 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动

【队列】滑动窗口的最大值

谁说胖子不能爱 提交于 2020-02-27 19:00:10
单调栈   单调栈,就是一个栈,里面的元素满足一定的单调性。(多见于单调增/单调减) 1)新元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除,直到栈为空或者栈满足单调性才能加入新元素。 2)单调栈是 O(n) 级的时间复杂度,所有元素只会进入栈一次,并且出栈后再也不会进栈。 3)单调栈可以找到元素向左遍历第一个比他小(大)的元素,也就是说在元素进栈前他向左拓展的区间已经确定,在出栈前她能向右拓展的区间也能确定(左区间好理解,仔细体会右区间的确定,若该元素至遍历结束后也未出栈,那么就是说在原数组中,该元素的右方向没有一个元素可以比它大/小,那么该元素的右边界就是原数组的大小(就是没有右边界),否则它的右边界就是令它出栈的元素)。 例1 题目描述:   给定一个数组,返回一个大小相同的数组。返回的数组的第i个位置的值应当是,对于原数组中的第i个元素,至少往右走多少步,才能遇到一个比自己大的元素(如果之后没有比自己大的元素,或者已经是最后一个元素,则在返回数组的对应位置放上-1) Example: Input 5,3,1,2,4 Output -1 3 1 1 -1 Solution #include <iostream> #include <vector> #include <stack> using namespace std; vector<int> stepToGreater

【剑指offer】面试题48. 最长不含重复字符的子字符串

☆樱花仙子☆ 提交于 2020-02-27 18:20:09
解题思路 利用unordered_map作滑动窗口 算法: 1.初始化头尾指针分别为head=0,tail=0 2.tail指针右移,并将tail所指元素加入到窗口中,判断tail当前指向的元素在滑动窗口中是否出现, - 如果出现,则将滑动窗口当前head所指元素数量-1,并移动head,直到该窗口中不包含该元素. - 如果未出现,则更新res,并进行下一轮循环,直到tail=s.size() 3.返回结果res 代码 class Solution { public : int lengthOfLongestSubstring ( string s ) { unordered_map < char , int > window ; int res = 0 ; //存储答案 int head = 0 , tail = 0 ; //双指针 for ( ; tail < s . size ( ) ; tail ++ ) { char temp = s [ tail ] ; //当前字符 window [ temp ] ++ ; //判断该窗口中是否存在该元素 //如果存在该元素,使head右移,直到该窗口不包含该元素 while ( window [ temp ] > 1 ) { char temp2 = s [ head ] ; window [ temp2 ] -- ; /