马上翻译:滑动窗口就是可以滑动的窗口。嘻嘻嘻~开玩笑哈

1 滑动窗口的概念

滑动窗口在计算机科学领域中我认为有两层概念,一种是计算机网络中的滑动窗口协议另一种则是滑动窗口算法,他们在计算机科学领域都有非常广泛的应用,接下来我将用一篇文章来讲述滑动窗口协议和滑动窗口算法在计算机网络和软件编程领域的应用场景和原理,开始表演~

1.1 滑动窗口协议

在TCP网络连接和数据传输中,为了保证避免拥塞的发生,对网络数据传输进行流量控制,该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。

1.2 滑动窗口算法

与滑动窗口协议的概念基本相同,只是应用场景不一样,是在给定特定窗口大小的数组或字符串上执行要求的操作。

2 详解滑动窗口协议在TCP网络中的应用原理

2.1 如果没有滑动窗口会怎样?

众所周知TCP是点对点连接,在TCP中只有两个角色,Client和Server,因此发送数据包就要一边发一边接,画图表示:

问题分析:

如果在单包传输中,client端发送数据之后没有得到响应,则第二次发送就会收到影响,或发送异常或接收异常,在多包传输中,如果接收包也出现异常,则必将影响同时发送的其他的数据包(或是次序或是内容)。因此我们需要一个协议或算法来实现安全性和吞吐量之前的权衡,下面就接收滑动窗口的引入。

2.2 滑动窗口引入和作用


图中有4个类型的框框,分别代表着一个数据包的四种状态,为了保证数据包发送和接收的顺序性,数据包必须按照顺序发送和接收,因此窗口的大小就意味着网络传输的吞吐量。

如何解决丢包情况?

如果对方的ACK报文在响应过程中丢失,那么解决方法就是超时重传,超时重传的核心目的也是保护报文发送的顺序性,因此我们也很容易的能总结出滑动窗口的一个缺陷所在:必须要保证顺序性

3 详解滑动窗口算法在高并发限流领域的应用原理

限流问题是在高并发系统设计中躲不开的问题之一,为什么要限流?

因为在短时间的高并发下,系统的承载能力有限,而这种高并发又是短时的,如果永久性的增加系统的资源来应对短时间的高并发,显然是得不偿失的,因此我们需要有一套专门应对短时间内高并发的算法,让系统能够最大限度的接收和处理响应,才是我们最终的目的。

正常情况:

高并发环境下:

3.1 Java实现滑动窗口算法基本原理


编程中的滑动窗口相比网络传输而言较为简单一些,主要是大部分情况都不需要考虑经过窗口部分数据的响应情况,只需要安装部分的条件向一定的方向进行“滑动”。

3.2 Java实现滑动窗口算法代码

问题场景:

力扣题https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

解决:

/*** 滑动窗口算法** @param str* @return*/
public int lengthOfLongestSubstring(String str) {int n = str.length();Set<Character> set = new HashSet<>();int ans = 0, i = 0, j = 0;//窗口的左边是i,右边是j,下列算法将窗口的左右移动,截取出其中一段while (i < n && j < n) {//如果set中不存在该字母,就将j+1,相当于窗口右边向右移动一格,左边不动if (!set.contains(str.charAt(j))) {set.add(str.charAt(j++));//记录目前存在过的最大的子字符长度ans = Math.max(ans, j - i);//如果set中存在该字母,则将窗口左边向右移动一格,右边不动,直到该窗口中不存在重复的字符} else {set.remove(str.charAt(i++));}}return ans;
}

3.3 使用滑动窗口进行限流

/*** @desc: 滑动窗口算法* @author: YanMingXin* @create: 2021/10/9-10:43**/
public class Test01 {/*** 数据包队列*/private ConcurrentLinkedQueue<Long> queue = new ConcurrentLinkedQueue<>();/*** 间隔秒数*/private int rate;/*** 最大限流*/private int max;public Test01(int max, int rate) {this.rate = rate;this.max = max;/*** 执行清理queue任务*/new Thread(() -> {while (true) {try {// 等待 间隔秒数-1 执行清理操作Thread.sleep((rate - 1) * 1000L);} catch (InterruptedException e) {e.printStackTrace();}clean();}}).start();}/*** 获取令牌,并且添加时间*/public void take() {long start = System.currentTimeMillis();try {int size = sizeOfValid();if (size > max) {System.err.println("超限");}synchronized (queue) {if (sizeOfValid() > max) {System.err.println("超限:Queue中有 " + queue.size() + " 最大数量 " + max);}this.queue.offer(System.currentTimeMillis());}System.out.println("Queue中有 " + queue.size() + " 最大数量 " + max);} catch (Exception e) {e.printStackTrace();}}public int sizeOfValid() {Iterator<Long> it = queue.iterator();Long ms = System.currentTimeMillis() - rate * 1000;int count = 0;while (it.hasNext()) {long t = it.next();if (t > ms) {// 在当前的统计时间范围内count++;}}return count;}/*** 清理过期的时间*/public void clean() {Long c = System.currentTimeMillis() - rate * 1000;Long tl = null;while ((tl = queue.peek()) != null && tl < c) {System.out.println("clean data ...");queue.poll();}}public static void main(String[] args) {final Test01 timeWindow = new Test01(20, 3);// 测试3个线程for (int i = 0; i < 3; i++) {new Thread(() -> {while (true) {try {Thread.sleep(new Random().nextInt(20) * 100);} catch (InterruptedException e) {e.printStackTrace();}timeWindow.take();}}).start();}}
}

参考文章:

https://www.cnblogs.com/coder-programming/p/10627746.html

https://www.cnblogs.com/RioTian/p/12425981.html

https://github.com/doocs/advanced-java/blob/main/docs/high-concurrency/huifer-how-to-limit-current.md

翻译翻译,什么是滑动窗口相关推荐

  1. easyui源码翻译1.32--Messager(消息窗口)

    前言 使用$.messager.defaults重写默认值对象.下载该插件翻译源码 消息窗口提供了不同的消息框风格,包含alert(警告框), confirm(确认框), prompt(提示框), p ...

  2. 翻译翻译:什么叫架构?

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者:Yrion | 链接:cnblogs.com/wyq178/p/12151160.html 这个知识分享的爆炸时代,鉴于 ...

  3. WireShark 探索网络请求过程(五层网络模型、三次握手、滑动窗口协议)

    ​当我们在浏览器输入URL点击确认后,浏览器展示出网页信息.可你曾想过这其中的过程是怎样的?理论性较强的朋友可能知道后续DNS会解析地址,然后TCP/IP三次握手建立起连接,紧接着客户端与服务器开始传 ...

  4. 算法与数据结构 - 滑动窗口

    滑动窗口 滑动窗口的作用是可以将一部分问题中的嵌套循环转变为一个单循环,因此可以减少时间复杂度. 滑动窗口的基本思想 使用 left 和 right 指针来指定窗口大小,默认值都为 0. 先让 rig ...

  5. 滑动窗口在重构数据集的作用

    step1:使用滑动窗口重构数据集 给定时间序列数据集的数字序列,我们可以将数据重构为看起来像监督学习问题. 我们可以通过使用以前的时间步作为输入变量并使用下一个时间步作为输出变量来做到这一点. 通过 ...

  6. [通俗易懂]深入理解TCP协议(下):RTT、滑动窗口、拥塞处理

    转自即时通讯网:http://www.52im.net/ 前言 此文为系列文章的下篇,如果你对TCP不熟悉的话,请先看看上篇<[通俗易懂]深入理解TCP协议(上):理论基础> . 上篇中, ...

  7. sscanf 连续相同编辑符_基于单调栈的滑动窗口法求解“和至少为 K 的最短连续子数组”...

    题目解读 题目要求我们给出一个最短的连续子数组,且这个子数组的和要大于等于 K.乍一看,除了暴力,似乎没什么思路.由于数组规模为 50000,暴力肯定会超时的.但是,我们还是要先暴力一把,看看有什么灵 ...

  8. 常见面试算题题中的滑动窗口问题

    LeetCode1004. 最大连续1的个数 III 题目描述 给定一个由若干 0 和 1 组成的数组 A,最多可以将数组A中的 K 个元素的值从 0 变成 1 ,返回仅包含 1 的最长(连续)子数组 ...

  9. 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)

    文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...

最新文章

  1. 星梦缘陈彦妃_还记得《星梦缘》的女主吗,她现在变成这样了
  2. Struts2 为什么被淘汰?自己作死!
  3. 【视频】vue动态绑定css样式
  4. 我只是一只碌碌无为的工蚁 : (
  5. 命令编写注册表文件修改注册表项
  6. 为什么沿梯度方向,函数变化最快???
  7. HDU 5305 Friends dfs
  8. Ghost Blog
  9. .NET下添加Redis
  10. 关闭git命令窗快捷键_git常用命令与AndroidStudio常用快捷键
  11. linux系统导航怎么刷安卓系统升级,4s送的10.2寸安卓导航刷机教程1
  12. adb shell settings(系统服务:settings)
  13. 工业以太网与现场总线
  14. python实现压缩文件夹
  15. windows下pyqt4
  16. 再见,2020。您好,2021!
  17. javascript实现汉诺塔
  18. 利用http://www.forshare.me/qq/访问陌生人的QQ空间
  19. 输入一个整数n及一个n阶方阵,判断该方阵是否以主对角线对称,输出“Yes”或“No”。
  20. [转] Scalers:刻意练习的本质就是持续行动+刻意学习

热门文章

  1. Spring Cloud GateWay 原理
  2. 11月区块链政策密集发布,监管与扶持并重现冰火天
  3. RowMapper接口
  4. 569_termux下查看一加7手机的配置信息以及基本系统信息
  5. hidd是什么进程_什么是hidd,为什么它可以在Mac上运行?
  6. android打印动画,用 Android 实现一条小金鱼游动动画(超棒)
  7. 用python画小黄人-学Python画画:应用Turtle库画一个蠢萌的小黄人
  8. ios7版 30天精通iPhone手机编程 第2天 第一个程序“Hello”
  9. python网络数据处理之html2text模块和readability模块学习使用
  10. 【调剂】宝鸡文理学院找计算机电子信息0854专硕调剂,有意向请联系!