
大家好,我是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。