【AI 时代软件工程师的算法图谱】02 滑动窗口:流式数据的流量控制

大家好,我是Tony Bai。

欢迎来到我们的专栏 《AI 时代软件工程师的算法图谱》的第二讲。

上一讲我们学习了双指针,通过操控两个游标,我们得以在静态的数据中自由穿梭。

今天,我们要让这两个指针"动"起来,形成一个动态的视窗 ,去捕获流式数据中的瞬时状态。这就是 滑动窗口(Sliding Window)

在刷题时,滑动窗口常用于"寻找满足条件的最长/最短子串"。但在工程世界,它是流量控制、网络协议、实时监控的灵魂。TCP 协议靠它来避免网络拥塞,微服务网关(如 Sentinel, Hystrix)靠它来计算 QPS 并执行熔断,流计算引擎(如 Flink)靠它来处理无界数据流。

今天,我们就用 Go 语言,手搓一个高并发场景下的滑动窗口限流器

模式解构:窗口的伸缩呼吸

滑动窗口本质上是双指针的一种特例 :维护一个左指针 left 和一个右指针 right,它们之间的区域 [left, right] 就是"窗口"。

根据窗口大小是否固定,分为两种形态:

固定窗口 (Fixed Size Window)

  • 形态: 窗口大小 k 不变。right 向前走一步,left 也必须跟着走一步。像一个定长的框在数组上滑动。

  • 适用场景: 计算连续 N 天的股票移动平均值(Moving Average)、TCP 协议的发送窗口。

  • 核心逻辑: 入窗操作(nums[right]) -> 出窗操作(nums[left]) -> Update Result