滑动窗口

关于TCP协议的面筋整理

情到浓时终转凉″ 提交于 2020-02-24 20:16:14
TCP和UDP的特征及区别、分别适用于那些场景 特征 TCP:面向连接、面向字节流、提供拥塞控制、全双工、一对一通信、首部开销大(固定首部20字节)、提供可靠交付服务 UDP:无连接、面向报文、无拥塞控制、支持一对一、一对多、多对一、多对多的交互模式、头部开销小(仅8字节)、不可靠、时延小、实时性强 TCP报文段、UDP数据报首部相同部分:源端口、目的端口、校验和 区别 TCP是面向连接的;而UDP是无连接的,发送数据前不需要建立连接 面向连接的服务,通信双方在进行通信之前,要先在双方建立起一个完整的可以彼此沟通的通道(TCP三次握手建立连接),连接双方要为连接分配内核资源。在通信过程中,整个连接的情况一直可以被实时地 监控和管理 非面向连接的服务,不需要预先建立一个联络两个通信节点的连接,需要通信的时候,发送节点就可以往网络上发送信息,让信息自主地在网络上去传,一般在传输的过程中不再加以监控。 TCP提供可靠的服务,即通过TCP连接传送的数据无差错、不丢失、不重复且按序到达;UDP只是尽最大努力交付,不保证可靠【可能丢包、不保证有序】 TCP面向字节流;UDP面向报文段 TCP连接只能点对点,而UDP支持一对一、一对多、多对一、多对多的交互模式 TCP数据传输慢;UDP数据传输快 TCP首部开销大;UDP首部开销小 TCP逻辑通信是全双工的可靠通信;UDP是不可靠通信

QSplitter实现滑动窗口和悬浮按钮

依然范特西╮ 提交于 2020-02-17 12:39:51
1 QSplitter实现滑动窗口和悬浮按钮 软件应用中需要设计右侧滑动窗口,通过一个按钮来实现窗口的隐藏和显示,应用场景比如显示主界面的详细信息。 (1) 在qt design 中添加QSplitter ,添加主窗口界面和右侧滑动窗口界面。 (2) 在程序中添加浮动按钮,并在初始化中设置按钮的属性 m_btnFold.setParent(this); m_btnFold.setFocusPolicy(Qt::NoFocus); m_btnFold.setFixedSize(16, 78);//设置大小 m_btnFold.setIconSize(m_btnFold.size()); m_btnFold.move(this->width() - m_btnFold.width(), (this->height() - m_btnFold.height()) / 2);//设置移动位置 m_btnFold.setStyleSheet("border:0px;border-style:outset;");//设置无边框 m_btnFold.setFlat(true);//设置扁平按钮 m_btnFold.setVisible(true);//设置可见 m_btnFold.setStyleSheet("background:url(:/qss/image/unfoldbtn.png)

滑动窗口算法技巧

冷暖自知 提交于 2020-02-17 10:28:26
本文详解「滑动窗口」这种高级双指针技巧的算法框架,带你秒杀几道高难度的子字符串匹配问题。 LeetCode 上至少有 9 道题目可以用此方法高效解决。但是有几道是 VIP 题目,有几道题目虽不难但太复杂,所以本文只选择点赞最高,较为经典的,最能够讲明白的三道题来讲解。第一题为了让读者掌握算法模板,篇幅相对长,后两题就基本秒杀了。 本文代码为 C++ 实现,不会用到什么编程方面的奇技淫巧,但是还是简单介绍一下一些用到的数据结构,以免有的读者因为语言的细节问题阻碍对算法思想的理解: unordered_map 就是哈希表(字典),它的一个方法 count(key) 相当于 containsKey(key) 可以判断键 key 是否存在。 可以使用方括号访问键对应的值 map[key]。需要注意的是,如果该 key 不存在,C++ 会自动创建这个 key,并把 map[key] 赋值为 0。 所以代码中多次出现的 map[key]++ 相当于 Java 的 map.put(key, map.getOrDefault(key, 0) + 1) 。 本文大部分代码都是图片形式,可以点开放大,更重要的是可以左右滑动方便对比代码。下面进入正题。 一、最小覆盖子串 题目不难理解,就是说要在 S(source) 中找到包含 T(target) 中全部字母的一个子串,顺序无所谓

python滑动窗口处理时序数据

北慕城南 提交于 2020-02-13 10:56:18
使用库sklearn, pandas, numpy 读取数据 读取日期格式的数据,转化为DateFrame,如 2019-01-02 00:00:01.001 import pandas as pd df = pd . read_csv ( file_path , #文件地址 header = 0 , #0为手动输入表头 names = [ 'date' , 'value' ] , #表头名称 index_col = 'date' , #设置'date'列为索引 parse_dates = [ 'date' ] , #对'date'列进行转化为DateFrame date_parser = lambda d : pd . datetime . strptime ( d , '%Y-%d-%m %H:%M%S.%f' ) #转化方法 ) 滑动窗口 r = df . rolling ( window = '1d' ) #使用1天作为窗口长度,必须是dateframe格式的数据才可以使用offset;否则必须用数据点个数 features = pd . concat ( [ r . min ( ) , r . max ( ) , r . mean ( ) , r . median ( ) ] , axis = 1 ) features = features . dropna ( axis

滑动窗口(单调队列)

≯℡__Kan透↙ 提交于 2020-02-13 00:49:21
给定一个大小为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 完整代码: #include <iostream> #include <cstring> #include <queue> using namespace std; const

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

雨燕双飞 提交于 2020-02-11 08:29:17
题目链接 https://leetcode-cn.com/problems/sliding-window-maximum/ 题目内容 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置|最大值 -|- [1 3 -1] -3 5 3 6 7|3| 1 [3 -1 -3] 5 3 6 7|3| 1 3 [-1 -3 5] 3 6 7| 5| 1 3 -1 [-3 5 3] 6 7| 5| 1 3 -1 -3 [5 3 6] 7|6| 1 3 -1 -3 5 [3 6 7]|7| 分析 1、创建一个双端队列用来存储nums数组中元素的索引; 2、创建一个结果数组存储达到窗口大小时,在窗口内的元素; 3、没达到窗口大小时:如果双端队列是空的,那么直接从队尾插入元素的索引,如果双端队列不为空,需要保证双端队列中的索引在nums中的值是递减的。达到窗口大小时,直接将双端队列的头部元素在nums中的值存储到结果数组。 如图: 先放动态图: 再放静态图; 代码 import jdk.jshell.spi

【python-leetcode03-滑动窗口法】无重复字符的最大子串

随声附和 提交于 2020-02-10 23:23:33
问题描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 按照惯例,首先是我们的简单版滑动窗口法: class Solution: def lengthOfLongestSubstring(self, s: str) -> int: tmp = 0 #用于记录满足条件得最大值 for i in range(1,len(s)+1):#步长从1到len(s)+1 for j in range(len(s)-i+1):#窗口左端 if len(set(s[j:j+i])) == len(s[j:j+i]):#如果取集合后的长度和原始窗口长度一样,说明这个窗口是不含重复字符的 tmp = max(tmp,i)#更新tmp的值 return tmp #最后返回即可 看下结果,依旧超时,不过呢: 只有一个用例没通过,如果想要把题目做出来

(转)TCP的滑动窗口与拥塞窗口(主要讲慢启动,拥塞避免,快重传,快恢复)

会有一股神秘感。 提交于 2020-02-07 21:42:39
原地址 https://blog.csdn.net/ligupeng7929/article/details/79597423 因此我们先了解一下16位的窗口大小究竟有什么作用。 窗口分为滑动窗口和拥塞窗口。 滑动窗口是接受数据端使用的窗口大小,用来告知发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的。 那么对于数据的发送端就是拥塞窗口了,拥塞窗口不代表缓存,拥塞窗口指某一源端数据流在一个RTT内可以最多发送的数据包数 一、滑动窗口 滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度,不过如果接收端的缓冲区一旦面临数据溢出,窗口大小值也会随之被设置一个更小的值通知给发送端,从而控制数据发送量(发送端会根据接收端指示,进行流量控制)。 对ACK的再认识,ack通常被理解为收到数据后给出的一个确认ACK,ACK包含两个非常重要的信息: 一是期望接收到的下一字节的序号n,该n代表接收方已经接收到了前n-1字节数据,此时如果接收方收到第n+1字节数据而不是第n字节数据,接 收方是不会发送序号为n+2的ACK的。举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,但是接下来收到的是 2049-3072,它是不会发送确认号为3072的ACK

Flink窗口之滑动窗口scala版本

二次信任 提交于 2020-02-07 07:49:50
Flink窗口之滑动窗口scala版本 代码 package windows import org . apache . flink . api . java . tuple . Tuple import org . apache . flink . streaming . api . scala . _ import org . apache . flink . streaming . api . windowing . time . Time import org . apache . flink . streaming . api . windowing . windows . TimeWindow /**滑动窗口*/ object SlidingWindows { def main ( args : Array [ String ] ) : Unit = { val env : StreamExecutionEnvironment = StreamExecutionEnvironment . getExecutionEnvironment val line : DataStream [ String ] = env . socketTextStream ( "t1" , 9999 ) val flatMaped : DataStream [ String ] = line

滑动窗口的最大值

烂漫一生 提交于 2020-02-06 03:11:36
该题考察滑动一数组框时,最大值的变化,我们可以使用双指针来进行滑动 灵感来自于LeetCode 长度最小的子数组 中的利用双指针将时间复杂度降为O(n),详情看代码 import java . util . ArrayList ; public class Solution { public ArrayList < Integer > maxInWindows ( int [ ] num , int size ) { ArrayList < Integer > arr = new ArrayList < > ( ) ; //如果数组为零或者数组小于size,或者size为零,都是输出空链表 if ( num . length == 0 || size == 0 ) { return new ArrayList < Integer > ( ) ; } if ( num . length < size ) { return new ArrayList < Integer > ( ) ; } //使用双指针进行计算,首先从第一个滑动模块开始, //设定标志位 stand,进行首次判断 int begin = 0 ; int end = size - 1 ; int max = Integer . MIN_VALUE ; int stand = 0 ; for ( int i = 0 ;