滑动窗口

关于滑动窗口

醉酒当歌 提交于 2020-02-03 00:59:23
1.滑动窗口的概念 发送端和接收端分别设定发送窗口和接收窗口 。 发送窗口用来对发送端进行流量控制。 发送窗口的大小 WT 代表在还没有收到对方确认信息的情况下发送端最多可以发送多少个数据帧。 接收端设置接收窗口 在接收端只有当收到的数据帧的发送序号落入接收窗口内才允许将该数据帧收下。 若接收到的数据帧落在接收窗口之外,则一律将其丢弃。 在连续 ARQ 协议中,接收窗口的大小 WR = 1。 只有当收到的帧的序号与接收窗口一致时才能接收该帧。否则,就丢弃它。 每收到一个序号正确的帧,接收窗口就向前(即向右方)滑动一个帧的位置。同时发送对该帧的确认。 滑动窗口的重要特性 只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。 收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。 当发送窗口和接收窗口的大小都等于 1时,就是双工的停止等待协议。 来源: CSDN 作者: 867811 链接: https://blog.csdn.net/weixin_43557605/article/details/89220194

浅谈单调队列解决滑动窗口问题

旧街凉风 提交于 2020-01-31 04:17:14
这次我们了解一下 滑动窗口 的问题 作者ID:qq_43341171 首先,让我们了解一下 滑动窗口 是什么? 这里有一张图(来自POJ),解释了滑动窗口的意思: 我们可以看见,一个长度固定为3的框(窗口)从左端点移动到右端点,每次移动一个数,这就是我们所说的“ 滑动窗口 ”。 而 每次滑动窗口的最大值以及最小值 就指的是滑动窗口在每次移动后区间内的最大值以及最小值。 例如:上图当中,第一次移动后(第一排),窗口区间包含了:“1,3,-1”。那么滑动窗口的长度为3(有3个数),在这3个数当中,最大值为3,最小值为-1,所以这个滑动窗口的最大值为3,最小值为-1。 了解了滑动窗口,让我们再来了解一下 单调队列 单调队列,即单调递减或单调递增的队列。 但是,这个说法很笼统,到底什么是单调队列呢? 这里有张我做的图: 从这张图里,我们能看出: 单调递增队列(从队首到队尾递增)的维护方法: 入队一个数,就把它前面所有比它大的数给弹掉 准确地说 ,是把前面所有比它大的数给弹掉 再入队 单调递减队列(从队首到队尾递减)的维护方法: 入队一个数,就把它前面所有比它小的数给弹掉 准确地说 ,是把前面所有比它小的数给弹掉 再入队 但是问题来了:单调队列是如何把后面的数给弹掉的呢?(我们众所周知,队列只能在队首弹出) 答案(敲黑板):其实单调队列的两端都可以弹出!!! 那么这样,单调队列的问题就解决啦

239. 滑动窗口最大值

倖福魔咒の 提交于 2020-01-31 02:31:28
1.暴力法 # define VECTOR_INITIAL_CAPACITY 16 typedef struct { int size ; int capacity ; int * data ; } Vector ; void init ( Vector * vector ) { vector -> size = 0 ; vector -> capacity = VECTOR_INITIAL_CAPACITY ; vector -> data = malloc ( sizeof ( int ) * vector -> capacity ) ; } void resize ( Vector * vector ) { if ( vector -> size >= vector -> capacity ) { vector -> capacity * = 2 ; vector -> data = realloc ( vector -> data , sizeof ( int ) * vector -> capacity ) ; } } void append ( Vector * vector , int value ) { resize ( vector ) ; vector -> data [ vector -> size ++ ] = value ; } void free

滑动窗口

主宰稳场 提交于 2020-01-29 06:07:38
【2016年 题41】假设题33~41图中的H3访问Web服务器S时,S为新建的TCP连接分配了20 KB(K=1 024)的接收缓存,最大段长MSS=1 KB,平均往返时间RTT=200 ms。H3建立连接时的初始序号为100,且持续以MSS大小的段向S发送数据,拥塞窗口初始阈值为32 KB;S对收到的每个段进行确认,并通告新的接收窗口。假定TCP连接建立完成后,S端的TCP接收缓存仅有数据存入而无数据取出。请回答下列问题。 在TCP连接建立过程中,H3收到的S发送过来的第二次握手TCP段的SYN和ACK标志位的值分别是多少?确认序号是多少? H3收到的第8个确认段所通告的接收窗口是多少?此时H3的拥塞窗口变为多少?H3的发送窗口变为多少? 当H3的发送窗口等于0时,下一个待发送的数据段序号是多少?H3从发送第1个数据段到发送窗口等于0时刻为止,平均数据传输速率是多少(忽略段的传输延时)? 若H3与S之间通信已经结束,在t时刻H3请求断开该连接,则从t时刻起,S释放该连接的最短时间是多少? 题33~41图 【解析】 1)本小题考查TCP连接建立过程,需要考生掌握如下图所示的细节。 在本题中,H3收到的S发送过来的第二次握手TCP段的SYN和ACK标志位的值都为1,这是对H3发来的TCP连接请求的确认;由于题目给定H3建立连接时的初始序号为100,则该确认报文段的确认序号为100

Hystrix 配置参数全解析

我与影子孤独终老i 提交于 2020-01-27 22:26:18
/*--> */ /*--> */ 前言 不久前在部门周会上分享了 Hystrix 源码解析之后,就无奈地背上了 专家包袱 ,同事们都认为我对 Hystrix 很熟,我们接触 Hystrix 更多的还是工作中的使用和配置,所以很多人一遇到 Hystrix 的配置问题就会过来问我。为了不让他们失望,我把 Hystrix 的 配置文档 仔细看了一遍,将有疑问的点通过翻源码、查官方 issue、自己实验的方式整理了一遍,这才对 Hystrix 的配置有了一定的了解。 在了解这些配置项的过程中,我也发现了很多坑,平常我们使用中认为理所应当的值并不会让 Hystrix 如期望工作,没有经过斟酌就复制粘贴的配置会让 Hystrix 永远不会起作用。于是写下本文,希望能帮助小伙伴们掌握 Hystrix。如果想了解 Hystrix 的话,可以搭配我之前的分享 PPT: Hystrix 源码解析 文章欢迎转载,请尊重作者劳动成果,带上原文链接:https://www.cnblogs.com/zhenbianshu/p/9630167.html HystrixCommand 配置方式 我们的配置都是基于 HystrixCommand 的,我们通过在方法上添加 @HystrixCommand 注解并配置注解的参数来实现配置,但有的时候一个类里面会有多个 Hystrix 方法

洛谷 P1886 滑动窗口 /【模板】单调队列

夙愿已清 提交于 2020-01-25 19:16:19
纯板子题,入队时保证单调性,即单调栈,出队保证题目条件,本题即窗口长度k,在入队出队时都可以维护信息 const int maxm = 1e6+5; int buf[maxm], maxq[maxm], minq[maxm], ans1[maxm], ans2[maxm]; int main() { ios::sync_with_stdio(false), cin.tie(0); int n, k, l1 = 0, r1 = -1, l2 = 0, r2 = -1; cin >> n >> k; for(int i = 0; i < n; ++i) cin >> buf[i]; for(int i = 0; i < n; ++i) { while(l1 <= r1 && minq[l1] <= i-k) l1++; while(l2 <= r2 && maxq[l2] <= i-k) l2++; while(l1 <= r1 && buf[minq[r1]] >= buf[i]) r1--; minq[++r1] = i; while(l2 <= r2 && buf[maxq[r2]] <= buf[i]) r2--; maxq[++r2] = i; if(i >= k-1) ans1[i] = buf[minq[l1]], ans2[i] = buf[maxq[l2]]; }

Acwing 831滑动窗口

橙三吉。 提交于 2020-01-17 03:11:19
#include<algorithm> #include<cstdio> using namespace std; const int N=1e5+10; int a[N],q[N]; int main() { int n,k; scanf("%d %d",&n,&k); int tt=-1,hh=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } 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--;//去除比a[i]大的 q[++tt]=i; if(i>=k-1) printf("%d ",a[q[hh]]); } printf("\n"); tt=-1,hh=0; 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; if(i>=k-1) printf("%d ",a[q[hh]]); } printf("\n"); } 来源: CSDN 作者: 晓屈 链接: https://blog.csdn.net/weixin_44488944

字典树 + 并查集 + 滑动窗口 + 优先队列 demo

拜拜、爱过 提交于 2020-01-16 09:57:25
统计一段时间内(500)单词出现的频率 单词最长为10 void init(); 初始化函数 void searchWord(int tsec, char str[], int num); 在tsec时刻,搜索了某一个单词str, 它的频率是num void banWord(int tsec, char str[]); 在tsec时刻,ban到了单词str,在以后的rank中不会再出现str void mergeWords(int tsec, char str1[], char str2[]); 在tsec时刻,合并单词,str2不在出现在rank中,且str2的频率都计算到str1中,相当于父子关系 int getRank10(int, char[][MAX_WORD_LEN + 1]); 在tsec时刻,返回该时刻以及前500s内的所有单词出现频率最高的单词。 # define MAX_WORD_LEN 10 # define USEFUL 0 # define BAN 1 # define MERGED 2 static void mstrcpy ( char dest [ ] , const char src [ ] ) { int i = 0 ; while ( ( dest [ i ] = src [ i ] ) != '\0' ) i ++ ; } static

Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

两盒软妹~` 提交于 2020-01-12 16:27:46
前言 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在 Spring Cloud 中 Hystrix 、 Ribbon 以及 Feign 它们三者之间在处理微服务调用超时从而触发熔断降级的关系是什么? 我们知道在 Spring Cloud 微服务体系下, 微服务之间的互相调用可以通过 Feign 进行声明式调用,在这个服务调用过程中 Feign 会通过 Ribbon 从服务注册中心获取目标微服务的服务器地址列表,之后在网络请求的过程中 Ribbon 就会将请求以负载均衡的方式打到微服务的不同实例上 ,从而实现 Spring Cloud 微服务架构中最为关键的功能即服务发现及客户端负载均衡调用。 另一方面微服务在互相调用的过程中, 为了防止某个微服务的故障消耗掉整个系统所有微服务的连接资源,所以在实施微服务调用的过程中我们会要求在调用方实施针对被调用微服务的熔断逻辑 。而要实现这个逻辑场景在 Spring Cloud 微服务框架下我们是通过 Hystrix 这个框架来实现的。 调用方会针对被调用微服务设置调用超时时间,一旦超时就会进入熔断逻辑,而这个故障指标信息也会返回给 Hystrix 组件, Hystrix 组件会根据熔断情况判断被调微服务的故障情况从而打开熔断器,之后所有针对该微服务的请求就会直接进入熔断逻辑

算法思维----滑动窗口

拜拜、爱过 提交于 2020-01-10 06:44:34
滑动窗口作为一种高级 双指针 技巧的框架,在日常算法中尤其是字符串匹配查询中经常用到。所以总结一下滑动窗口的框架思维。 首先需要熟悉一下滑动窗口常用的数据结构: 哈希表 ,也称为 字典 、 散列表 ,是一种 k => v 结构,这里就不细讲什么是哈希和哈希表了,因为作为基础的数据结构,应该大家都理解。 滑动窗口的思想一般是这样的: 在字符串S中使用双指针的左右指针技巧,初始化 left=right=0 ,我们把索引的闭合区间[left, right]称为一个「窗口」 不断增加right指针的值扩大窗口[left, right],直到窗口中的字符串符合要求(具体根据题意,稍后我们在题中理解) 符合要求后,我们停止增加right,转而增加left指针来缩小窗口[left, right],直到窗口中的字符串不再符合要求(也是根据题意哦)。注意,每次增加left,我们都要更新一轮结果。 重复第2步和第3步,直到right到达字符串S的尽头。 其实这个思路,在第2步相当在寻找一个「可行解」,在第3步 优化 这个「可行解」,最终执行完第4步,在这些可行解中寻找到一个「最优解」。左右指针轮流前进,窗口大小递增递减,窗口不断向右滑动直到尽头。 最小覆盖子串 题目的意思就是要在S中找到包含T中全部字母的一个子串,顺序无所谓,但是这个字串一定是所有可行解中最短的。 设,needs和window为计数器