温故知新 —— Sliding Window

简介: 滑动窗口算法可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。

image.png

滑动窗口算法



滑动窗口算法可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。


比如给定如下数组:

[ 5, 7, 1, 4, 3, 6, 2, 9, 2 ]


求出 5 个连续元素的最大和是多少?


[5, 7, 1, 4, 3] 是第一组 5 个连续元素,求和是 20[7, 1, 4, 3, 6] 是第二组 5 个连续元素,求和是 21......这样一直进行下去,最终对比发现 5 个连续元素的最大和是 24,由 [4, 3, 6, 2, 9] 组成;


简单粗暴的双层 for 循环算法实现:


const getMaxSumOfFiveContiguousElements = (arr) => {
  let maxSum = -Infinity;
  let currSum;
  for (let i = 0; i <= arr.length - 5; i++) {
    currSum = 0;
    for (let j = i; j < i + 5; j++) {
      currSum += arr[j];
    }
    maxSum = Math.max(maxSum, currSum);
  }
  return maxSum;
};


时间复杂度是 O(n*k),遍历情况如图示:

image.png


而通过滑动窗口算法,我们能将时间复杂度降低为 O(n)


我们将 5 个连续的元素放入一个窗口内,每做一次求和计算后,将窗口内的第一个数字减掉,然后再加上窗口外的后第一个数字,形成新的窗口,窗口长度不变,这样一直操作下去,直到窗口遍历完全部元素,结束遍历;

image.png


算法如下:

const getLargestSumOfFiveConsecutiveElements = (arr) => {
  let currSum = getSum(arr, 0, 4);
  let largestSum = currSum;
  for (let i = 1; i <= arr.length - 5; i++) {
    currSum -= arr[i - 1]; // subtract element to the left of curr window
    currSum += arr[i + 4]; // add last element in curr window
    largestSum = Math.max(largestSum, currSum);
  }
  return largestSum;
};
const getSum = (arr, start, end) => {
  let sum = 0;
  for (let i = start; i <= end; i++) {
    sum += arr[i];
  }
  return sum;
};


遍历图示:

image.png


通过 +1-1 的方式实现遍历,将双循环变成单循环,降低时间复杂度,这正是滑动窗口的技术要点;


当然,滑动窗口还有很多变形,比如长度不固定、滑动距离不是 1 ......

以上温故了滑动窗口的算法部分,接下来温故所学的 TCP 滑动窗口原理:


TCP 滑动窗口原理



起初,为了保证发送方与接收方之间,每个包都能被收到。并且是按次序的,发送过程是:

image.png

但是,这样又太慢了,于是升级为多个并行发送,加大吞吐量:

image.png

后来,为了实现“无序”发送,即做到:发送方拿到确认包 1 的时候,就发送包 3,而不是非要等拿到确认包 2 才能发包 3;


于是乎,滑动窗口粉墨登场;

image.png

窗口分为:已发送(未Ack)待发送(未Ack)两个部分,当已发送被 Ack 确认后,则发生窗口移动,将未发送的包划到待发送中去,这样一直移动下去,直至所有包发送完毕;针对丢包情况,滑动窗口有超时重传机制;

滑动窗口的最大优势在于:接收端可以根据自己的状况通告窗口大小,从而控制发送端的接收,进行流量控制


本篇温故算是小引,后续会带来更多关于滑动窗口的变形算法或应用~

我是掘金安东尼,公众号同名,输出暴露输入,技术洞见生活,下次再会~~


相关文章
|
关系型数据库 数据库 PostgreSQL
|
5月前
|
消息中间件 JavaScript 前端开发
详解事件循环与浏览器渲染机制
摘要:浏览器采用多进程架构,渲染主线程通过事件循环机制处理HTML解析、样式计算、布局等任务。异步机制避免主线程阻塞,任务按优先级在微队列、交互队列等不同队列中调度。JS执行会阻碍渲染,因其与渲染任务共享主线程。渲染流程包含解析、样式计算、布局、分层等阶段,最终由合成线程和GPU完成绘制。transform效率高因其仅影响合成阶段,不涉及主线程。reflow是布局重计算,repaint是绘制指令更新,两者均影响性能。
|
6月前
|
人工智能 语音技术 云计算
书尖 AI 功能实测|阿里云 AI 技术加持,与喜马拉雅听书体验深度对比
在阿里云AI赋能下,书尖AI实测展现三大优势:1.2亿册全品类书库、双人互动式AI播客、2分钟极速提炼书籍精华,并依托阿里云TTS实现自然听书体验。相较喜马拉雅,其AI深度解读与定制化能力更胜一筹。(239字)
|
1月前
|
人工智能 安全 数据管理
Gartner:2026年数据与分析顶级趋势
Gartner发布的2026年数据与分析顶级趋势报告显示,AI智能体、语义层进步以及数据与分析平台的融合,将成为引领未来发展的三大核心趋势。对于希望识别关键业务和技术主题的数据与分析(D&A)领导者而言,这些领域是实现高性价比价值、更快成为AI FIRST企业的关键。
|
2月前
|
存储 弹性计算 Java
阿里云服务器2核4G、4核8G、8核16G热门实例性能、价格对比与选型指南
2026年阿里云2核4G、4核8G、8核16G三大主流配置下,经济型e实例、通用算力型u1/u2i、计算型c9i及轻量应用服务器各有定位。轻量应用服务器低至38元/年,经济型e实例99元/年起,适合个人开发者与小微企业;通用算力型u1/u2i提供100%独享算力,u2i活动价3折起,4核8G仅1252元/年,性价比突出;计算型c9i搭载最新至强6处理器,单核算力提升20%,适合高并发、大数据等高性能场景。用户可根据预算与业务需求,从入门到旗舰按需选择。
|
8月前
|
搜索推荐 算法 NoSQL
用淘宝API优化商品推荐,让顾客一次买个够!
本文探讨如何利用淘宝开放平台API,结合关联规则、协同过滤与内容推荐算法,构建个性化商品推荐系统。通过挖掘用户行为与商品关联,优化购物车凑单、场景化组合推荐,提升转化率与客单价,实现“让顾客一次买个够”的智能推荐策略。
|
9月前
|
存储 Web App开发 监控
服装网 item_search 接口对接全攻略:从入门到精通
本文详解服装网商品搜索接口(item_search)的技术实现,涵盖多维度筛选、反爬对抗与数据解析,助你构建稳定高效的时尚商品采集系统,支持选品、趋势分析与比价应用。
|
11月前
|
机器学习/深度学习 人工智能 编解码
古籍版面分析新SOTA:HisDoc-DETR如何助力AI赋能古籍数字化难题
HisDoc-DETR是面向历史文献版面分析的创新模型,融合语义学习与多尺度特征融合,有效应对古籍中复杂布局、稀疏文字与破损模糊等挑战,实现高精度元素识别与结构解析,推动文化遗产数字化与学术研究发展。

热门文章

最新文章