关于滑动窗口算法的应用场景

发布时间 2023-04-10 15:15:11作者: 鱼007

算法原理

滑动窗口算法是一种基于双指针(又称滑动窗口)的算法,是一种常用的数据处理算法,通常用于解决数组或字符串中的子数组或子串问题。
滑动窗口算法的基本思想是使用两个指针left和right来定义一个窗口,窗口内包含满足特定条件的元素子序列,然后不断移动指针left和right来滑动窗口,以找到相应的子序列。

滑动窗口算法的具体步骤如下:

  • 初始化左指针left和右指针right,使它们都指向序列的起始位置。
  • 将窗口中的元素作为子序列进行处理,满足特定条件的子序列就是算法需要解决的问题。
  • 调整指针left和right,使得窗口向右移动:一般来说,先right边界先扩张,到达指定的位置(根据情况来定),然后left开始扩张,直到指定的位置。
  • 获得窗口内元素集合,执行业务逻辑,如记录最大值、最小值、求和等。
  • 重复上述步骤,直到滑动窗口遍历完整个序列。

由此可见,滑动窗口算法通过定义一个窗口并随着特定条件单向移动,使能够快速找到所需的子序列。
该算法也可以分类如下:

  • 固定窗口大小 —— 窗口大小是固定的,左右边界指针的扩张步长是固定的。
  • 可变窗口大小 —— 允许窗口大小随问题而变化,并且可以针对不同的问题选择最优的窗口大小。

常见应用场景

算法的优点在于时间复杂度为O(n),其中n为数组或字符串的长度。同时,由于只需要维护一个滑动窗口,算法的空间复杂度也比较低,通常为O(1)。因此滑动窗口算法可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。其可解决的问题,一般有如下特点:

  • 目标数据连续的、有序的、前后关联的数据集合。
  • 窗口可以通过单向递增(如由左向右滑动)实现移动

编程中常见的应用场景如下:

  • 业务接口限流模块,如电商秒杀限流、开放接口请求限流。
  • 离线统计业务场景:根据时间、账号等维度排序,以固定滑窗方式渐进执行直到跑完。
  • 算法题目如求解“子串的最大不同字符数”、“子数组的最大和”、“最长连续子数组”、“正数组中和为k的最长子数组”等,常见于针对字符串、数组、队列的运算。

限流场景应用

离线统计应用