什么是滑动窗口算法?
滑动窗口算法的核心思想是:维护一个固定大小的窗口,随着数据的不断输入,窗口不断向后滑动,从而达到对数据流进行局部统计或计算的目的。
应用场景
- 字符串处理: 查找最长无重复子串、字符串的排列等。
- 数组处理: 寻找数组中满足一定条件的子数组、滑动窗口的最大值/最小值等。
- 数据流处理: 实时处理数据流,统计窗口内的统计量;进而进行下一步处理,如:限流(在一定时间窗口内限制请求的次数)、降权(如果十分钟的订单数超过100,且失败率高于40%,就把该充值渠道的优先级降到最低)等。
PHP实现滑动窗口算法
1. 基于数组实现的滑动窗口
function findMaxSlidingWindow($nums, $k): array { $n = count($nums);&& if ($n == 0) { return []; }
$q = []; $res = [];
for ($i = 0; $i < $n; $i++) { while ($q && $nums[$q[count($q) - 1]] < $nums[$i]) { array_pop($q); } $q[] = $i;
if ($i >= $k - 1) { $res[] = $nums[$q[0]]; if ($q[0] === $i - $k + 1) { array_shift($q); } } }
return $res; }
$nums = [2,5,3,4,5,2,6,3,2,4,10,1,2,0]; $res = $this->findMaxSlidingWindow($nums,3); dump(json_encode($res));
|
2. 基于双指针实现的滑动窗口
function lengthOfLongestSubstring($s) { $n = strlen($s); $ans = 0; $left = 0; $right = 0; $set = []; while ($right < $n) { $c = $s[$right]; while (isset($set[$c])) { unset($set[$s[$left]]); $left++; } $set[$c] = true; $ans = max($ans, $right - $left + 1); $right++; } return $ans; }
$str = 'sdf233rdfekdfkkdfkdkgkdfgggegfgmffdfdfeer343ferrfe'; $res = $this->lengthOfLongestSubstring($str); dump($res);
|
注意事项
- 窗口大小: 滑动窗口的大小是根据具体问题来确定的。
- 数据类型: 滑动窗口可以处理各种类型的数据,包括数字、字符等。
- 时间复杂度: 滑动窗口算法的时间复杂度通常是O(n),其中n是输入数据的长度。