什么是滑动窗口,滑动窗口算法概念

学习计算机网络的学生知道滑动窗口协议Sliding Window Protocol ),它是实现TCP协议的核心策略之一,在网络数据传输过程中避免拥塞的发生该协议允许发送方在停止并等待确认之前发送多个数据包。 因为发送方不需要在每次发送数据包时停下来等待确认。 因此,该协议可以加速数据传输,提高网络吞吐量。 实际上,在流量控制、熔断、电流限制、超时等情况下,首先从滑动窗口的角度考虑问题。 例如,hystrix、sentinel等框架使用了这种思想。

窗口算法也是思想,是双指针的扩展和扩展,很多算法主题都可以根据其思想来解决,所以将两者放在一起学习。

首先了解什么是幻灯片,什么是窗口:

滑动:表示此窗口正在移动,即移动是沿一定方向移动。

窗口:窗口大小不固定,可持续扩大至满足一定条件; 也可以继续缩小,直到找到满足条件的最小窗口; 当然也可以是固定的大小。

滑动算法是对特定窗口大小的数组或字符串执行所需的操作。

也就是说,滑动窗口算法使用特定大小的字符串或数组,而不是整个字符串和数组,从而降低问题的复杂性和循环嵌套深度。其实这里就可以看出来滑动窗口主要应用在数组和字符串上。

窗口大小为3时,不断有新数据到来时,我们都保持大小在3的范围进行标记,超过3的放新,去除旧。 这其实和大小一定的队列很相似。 不同的是,数据可能存储在很大的空间里。 它只需要使用固定最大距离的两个标记来标记其上的一个区域。 例如:

可用于解决寻找满足一定条件的连续区间性质长度等)的问题。 由于区间连续,区间变化时,可以从传统计算结果中剔除搜索空间,减少了重复计算,减轻了时间复杂度。 在大多数情况下,“请找到满足xx第一个x的区间子字符串、子数组)的xx。 ”这样的问题可以用这个方法解决。

为了清楚起见,这里使用字符串进行说明。 但是关于排列其实也是一样的。 滑动窗口算法的思路如下。

在字符串s中,使用双指针中的左右指针技巧,初始化left=right=0,将索引关闭区间[left,right]称为一个“窗口”。

首先,要放大窗口[左,右],请增加右指针,直到窗口中的字符串满足要求。 包括t中的所有字符。

此时,我们将停止增加right,继续增加左指针缩小窗口[left,right],直到窗口中的字符串不满足要求不再包括t中的所有字符)。 同时,每次增加left,我们都必须更新结果。

重复步骤2和3,直到right到达字符串s的结尾。

这个想法其实也不难。 第二步是寻找“可行解”。 然后,步骤3对该“可行解”进行优化,最终找到最佳解。 左右指针交替前进,窗口大小增大或减小,窗口继续向右滑动。

接下来,让我们在图中了解一下,needs和window相当于计数器,分别记录了t中字符的出现次数和窗口中相应字符的出现次数。

初始状态:

增加灯光,直到窗口“左,右”包含所有t字符。

left不会继续移动,直到窗口中的字符串不再满足要求。

然后重复上述过程,首先移动right,然后移动left……直到right指针到达字符串s的结尾,算法才结束。

如果能理解上述过程,祝贺你。 完全掌握了滑动窗口算法的思想。 如何具体到达问题,如何给出答案是编程的问题。 稍后会提供模板,所以理解一下就好了吧。

对于大小不固定的滑动窗口,上述步骤可以方便地编写以下基本框架:

字符串s,t; 在//S中查找t的“最小覆盖子串”int left=0,right=0; string res=s; whilerights.size ) ) window.add ) s[right]; 光之美少女; //如果满足要求,则表示窗口结构已完成,移动左缩小窗口while 窗口满足要求)//如果该窗口的子列更短,则RESRES=minlen ) RES,window 窗口. remove s [ left ]; 左足; } }返回RES; 这与双指针基本匹配,但如果固定窗口大小k,则此时无需依赖左指针。 因为left=right-k可以归纳如下。

//固定窗口大小为k string s; 在//s中查找窗口大小为k时包含的最大元音字母的个数int right=0; whilerights.size ) ) window.add ) s[right]; 光之美少女; //如果满足要求,则表示窗口结构已完成,ifright=k ) /这已经是窗口了。 根据条件做某事/…可以计算窗口的最大值等/最后请不要忘记从窗口中删除right -k位置元素) }返回RES; 在第二章中,我们学习了双指针和滑动窗口的基本原理,然后开始分析许多典型的LeetCode主题。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注