滑动窗口

Python之滑动窗口

匿名 (未验证) 提交于 2019-12-02 22:11:45
对于一个数组array = ["n","v","l","f",...,"y","c","k"]; input 当前位置 index 数组的长度 arraySize 基于当前位置,(前/后)滑动窗口的元素数目 windowSize 即 滑动窗口(假定:包含当前元素 array[idx]) 总长:2*windowSize+1 output 滑动窗口中的元素下标数组 形如 【中间】idx=3,arraySize=7,windowSzie=2 => [1,2,3,4,5] 【偏前】idx=0,arraySize=7,windowSzie=2 => [5,6,0,1,2] 【偏后】idx=6,arraySize=7,windowSzie=2 => [4,5,6,1,0] [1] 循环队列 [2] 充分利用模运算的特点:最左边下标 (idx-windowSize)%arraySize 与 最后边下标(idx+windowSize)%arraySize可计算出来 利用思路2,节省更多计算资源。 def window(idx,arraySize,windowSize): """ 获得当前位置的滑动窗口[元素的下标数组] ----------------------------------- + 获得长为arraySize的列表中,以idex为中心

c++滑动窗口进阶版求找到字符串中所有字母异位词

故事扮演 提交于 2019-12-02 22:04:19
/** * 问题:找到字符串中所有字母异位词 * 要求:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。 * 注意事项:字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。 * 方法1:利用滑动数组去做 * class Solution { private: vector<int>list; int a[26]={0}; int b[26]={0}; public: vector<int> findAnagrams(string s, string p) { if(s.length()==0||p.length()==0||s.length()<p.length())return list; for(int i=0;i<p.length();++i){ a[s[i]-'a']++; b[p[i]-'a']++; } int left=0; int right=p.length(); while(right<s.length()) { if(isValid(a,b))list.push_back(left); a[s[left++]-'a']--; a[s[right++]-'a']++; } if(isValid(a,b))list.push_back(left); return list; }

luogu_P1886 滑动窗口

送分小仙女□ 提交于 2019-12-02 19:17:38
https://www.luogu.org/problem/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 输入格式 输入一共有两行,第一行为n,k。 第二行为n个数(<INT_MAX). 输出格式 输出共两行,第一行为每次窗口滑动的最小值 第二行为每次窗口滑动的最大值 填个高一时的坑 单调队列维护一下 #include<iostream> #include<cstdio> #define ri register int #define u int namespace opt { inline u in() { u x(0),f(1); char s(getchar()); while(s<'0'||s>'9') { if(s=='-') f=-1; s=getchar(); } while(s>='0'&&s<='9') { x=(x<<1)+(x<<3)+s-'0'; s=getchar(); } return x*f; } } using opt::in; #define NN 1000005 namespace mainstay { u N,K,l[2

c++的算法学习之滑动窗口求最长的无重复的子字符串

让人想犯罪 __ 提交于 2019-12-02 19:17:16
/*** * 问题:无重复字符的最长子串 * 方法:滑动数组法 * 主要思想:相当于双指针对撞和二分搜索法一个在左边一个在右边 * 当数组中出现重复的元素时则将左边的下标向右边移动一位 * 直到数组中所有的元素都不重复即可 * 而长度就等于右边的减去左边的 * */ class Solution { private: int res=0; int p[256]={0}; public: int lengthOfLongestSubstring(string s) { int left=0; int right=-1; while(left<s.size()) { if(right+1<s.size()&&p[s[right+1]]==0) p[s[++right]]++; else p[s[left++]]--; res=max(res,right-left+1); } return res; } }; 来源: https://www.cnblogs.com/z2529827226/p/11760063.html

常用限流算法

匆匆过客 提交于 2019-12-02 14:57:27
引言 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。今天我们要聊的就是限流(Rate Limit),限流的目的很简单,就是为了保护系统不被瞬时大流量冲垮, 限流这个概念我其实很早之前就有去了解过,不过无奈之前工作所接触业务的并发量实在是谈不上限流。目前公司大促峰值QPS在2w往上,自然而然需要用到限流,特别是类似秒杀这种瞬时流量非常大但实际成单率低的业务场景。 目前比较常用的限流算法有三种 计数器固定窗口算法 计数器滑动窗口算法 漏桶算法 令牌桶算法 计数器固定窗口算法 计数器固定窗口算法是最简单的限流算法,实现方式也比较简单。就是通过维护一个单位时间内的计数值,每当一个请求通过时,就将计数值加1,当计数值超过预先设定的阈值时,就拒绝单位时间内的其他请求。如果单位时间已经结束,则将计数器清零,开启下一轮的计数。 但是这种实现会有一个问题,举个例子: 假设我们设定1秒内允许通过的请求阈值是200,如果有用户在时间窗口的最后几毫秒发送了200个请求,紧接着又在下一个时间窗口开始时发送了200个请求,那么这个用户其实在一秒内成功请求了400次,显然超过了阈值但并不会被限流。其实这就是临界值问题,那么临界值问题要怎么解决呢? 代码实现 -- [CounterRateLimit.java](https://github.com/WangJunnan/learn/blob

洛谷 1886 滑动窗口

蹲街弑〆低调 提交于 2019-12-02 10:41:41
首先推荐一篇对我非常有益的 BOLG 。 这一题分两个部分最小值和最大值,做法本质相同。结构体node中的v记录的是价值,pos记录的是位置,h代表队头指针,t代表队尾指针,h和t在两个部分是分别独立的,所以要分别赋初值,这是实现单调队列的第一题,不怎么会口糊。 #include<bits/stdc++.h> using namespace std; const int N=1e6+5; int n,k,h,t,a[N]; struct node { int v,pos; }Q[N]; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); h=1;t=0; for(int i=1;i<=n;i++) { while(h<=t&&Q[h].pos+k<=i) h++; while(h<=t&&Q[t].v>=a[i]) t--; Q[++t].v=a[i]; Q[t].pos=i; if(i>=k) printf("%d ",Q[h].v); } h=1;t=0; puts(""); for(int i=1;i<=n;i++) { while(h<=t&&Q[h].pos+k<=i) h++; while(h<=t&&Q[t].v<=a[i]) t--; Q[++t].v=a[i]; Q

P1886 滑动窗口

妖精的绣舞 提交于 2019-12-02 09:23:34
题目链接: https://www.luogu.org/problem/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 输入格式 输入一共有两行,第一行为n,k。 第二行为n个数(<INT_MAX). 输出格式 输出共两行,第一行为每次窗口滑动的最小值 第二行为每次窗口滑动的最大值 输入输出样例 输入 #1 复制 8 3 1 3 -1 -3 5 3 6 7 输出 #1 复制 -1 -3 -3 -3 3 3 3 3 5 5 6 7 说明/提示 50%的数据,n<=10^5 100%的数据,n<=10^6 解题思路:题目不难可以使用线段树,RMQ等方法解题,这里使用了单调队列。单调队列,顾名思义就是具有单调性的队列,每次更新时往队尾插入,取出时用队首就好了。这里介绍一篇博客供参考吧。 单调队列: https://www.cnblogs.com/hanruyun/p/9614115.html #include<bits/stdc++.h> using namespace std; const int maxn=1e6+5; struct st{ int val

P1886 滑动窗口

£可爱£侵袭症+ 提交于 2019-12-02 00:19:09
题意::::现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 解法 1)单调队列 2)线段树(n * log n) 单调队列分析:: 考虑最小值情况:: 以该样例为例子说明::: 8 3 1 3 -1 -3 5 3 6 7(在这里非常巧妙的就是用下标来维护窗口大小,保证均在合理范围内不越界) q表示队列入队的为下标 1:队空 1 直接 入队 q={1}; 3 也直接入队 q={1,2};-1 则弹出前两项 q={3}; 2: -3 则弹出前一项 q={4}; 5 直接入队 q={4,5}; 3 则弹出前一项 q={4,6};同时 队头下次操作越界 所以pop q={6}; 3:6 直接入队 q={6,7}; 7 也直接入队 q={6,7,8};同时 队头下次操作越界 所以pop q={7,8}; 1):当队列非空且队尾指向的下标元素小于当前或等于当前值---->不断弹出队尾 2):下标入队尾 3):判断队头所指向的下标是否越界,是则 pop 最大值情况同样考虑\ 1 #include <bits/stdc++.h> 2 #define ll long long 3 const int maxn=1e6+5; 4 using namespace std; 5 6 int ma

洛谷 P1886 滑动窗口 题解

跟風遠走 提交于 2019-12-01 23:52:38
每日一题 day26 打卡 Analysis 单调队列模板 对于每一个区间,有以下操作: 1、维护队首(就是如果你已经是当前的m个之前那你就可以被删了,head++) 2、在队尾插入(每插入一个就要从队尾开始往前去除冗杂状态) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define int long long 6 #define maxn 1000000+10 7 using namespace std; 8 inline int read() 9 { 10 int x=0; 11 bool f=1; 12 char c=getchar(); 13 for(; !isdigit(c); c=getchar()) if(c=='-') f=0; 14 for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0'; 15 if(f) return x; 16 return 0-x; 17 } 18 inline void write(int x) 19 { 20 if(x<0){putchar('-');x=-x;} 21 if(x>9)write(x/10); 22 putchar(x%10+'0'); 23 }

20170907_我是如何讲清楚TCP协议是如何保证可靠传输的

我怕爱的太早我们不能终老 提交于 2019-12-01 19:50:31
20170907_我是如何讲清楚TCP协议是如何保证可靠传输的 题外话: 1、UDP: (1) UDP ,user datagram protocol, 用户数据报协议 ,不提供复杂的控制机制, 利用IP提供面向无连接的通信服务,并且它是将应用程序发送过来的数据包在收到的那一刻,立即按照原样发送到上的一种机制。 (2)即使在网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,在传输过程中如果出现丢包,UDP也不负责重发,甚至当数据包的到达顺序乱掉之后也没有纠正顺序的功能。因此, 如果需要这些细节控制的话,就需要在采用UDP协议的应用层去作出处理。 (3)由于UDP面向无连接,所以它可以随时向对端发送数据包,再加上UDP本身的处理既简单右高效, 所以UDP经常用于如下几个方面: 数据包总量比较少的通信,比如DNS、SNMP。 视频、音频等对实时性要求比较高的多媒体通信。 广播通信、多播通信。 2、TCP: (1) TCP,控制传输协议 ,和UDP的差别很大, 它充分实现了数据传输时的各种控制功能 : 针对发送端发出的数据包的确认应答信号ACK、、、针对数据包丢失或者出现定时器超时的重发机制、、、针对数据包到达接收端主机顺序乱掉的顺序控制、针对高效传输数据包的流动窗口控制、、、针对避免网络拥堵时候的流量控制、、