滑动窗口算法基本原理

学过计算机网络的同学,都知道滑动窗口协议(Sliding Window Protocol),该协议是 TCP协议 的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。

滑动窗口算法其实和这个是一样的,只是用的地方场景不一样,可以根据需要调整窗口的大小,有时也可以是固定窗口大小。

滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,这样就降低了问题的复杂度,从而也达到降低了循环的嵌套深度。其实这里就可以看出来滑动窗口主要应用在数组和字符串上。

示例

如下图所示,设定滑动窗口(window)大小为 3,当滑动窗口每次划过数组时,计算当前滑动窗口中元素的和,得到结果 res。
在这里插入图片描述
可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“ 请找到满足 xx 的最 x 的区间(子串、子数组)的 xx ”这类问题都可以使用该方法进行解决。

需要注意的是,滑动窗口算法更多的是一种思想,而非某种数据结构的使用。

滑动窗口法的大体框架

在介绍滑动窗口的框架时候,大家先从字面理解下:
滑动:说明这个窗口是移动的,也就是移动是按照一定方向来的。
窗口:窗口大小并不是固定的,可以不断扩容直到满足一定的条件;也可以不断缩小,直到找到一个满足条件的最小窗口;当然也可以是固定大小。

为了便于理解,这里采用的是字符串来讲解。但是对于数组其实也是一样的。滑动窗口算法的思路是这样:

  • 我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。
  • 我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(包含了 T 中的所有字符)。
  • 此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果。
  • 重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。

第 2 步相当于在寻找一个「可行解」,然后第 3 步在优化这个「可行解」,最终找到最优解。左右指针轮流前进,窗口大小增增减减,窗口不断向右滑动。

对于非固定大小的滑动窗口,可以简单地写出如下伪码框架:

string s, t;
    // 在 s 中寻找 t 的「最小覆盖子串」
    int left = 0, right = 0;
    string res = s;
    
    while(right < s.size()) {
        window.add(s[right]);
        right++;
        // 如果符合要求,说明窗口构造完成,移动 left 缩小窗口
        while (window 符合要求) {
            // 如果这个窗口的子串更短,则更新 res
            res = minLen(res, window);
            window.remove(s[left]);
            left++;
        }
    }
    return res;

对于固定窗口大小,可以总结如下:

// 固定窗口大小为 k
    string s;
    // 在 s 中寻找窗口大小为 k 时的所包含最大元音字母个数
    int  right = 0;
    while(right < s.size()) {
        window.add(s[right]);
        right++;
        // 如果符合要求,说明窗口构造完成,
        if (right>=k) {
            // 这是已经是一个窗口了,根据条件做一些事情
           // ... 可以计算窗口最大值等 
            // 最后不要忘记把 right -k 位置元素从窗口里面移除
        }
    }
    return res;
  • 可以发现此时不需要依赖 left 指针了。因为窗口固定所以其实就没必要使用left,right 双指针来控制窗口的大小。
    其次是对于窗口是固定的,可以轻易获取到 left 的位置,此处 left = right-k;
算法实例

尽可能使字符串相等
给你两个长度相同的字符串,s 和 t。

将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。

用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。

如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。

如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。

输入:s = “abcd”, t = “bcdf”, cost = 3
输出:3
解释:s 中的 “abc” 可以变为 “bcd”。开销为 3,所以最大长度为 3。

class Solution {
    public int equalSubstring(String s, String t, int maxCost) {
        int left = 0, right =0;
        int sum = 0;
        int res = 0;     // 构造窗口
        while (right < s.length()) {
            sum += Math.abs(s.charAt(right) - t.charAt(right));
            right++;       // 窗口构造完成,这时候要根据条件当前的窗口调整窗口大小
            while (sum > maxCost) {
                sum -=  Math.abs(s.charAt(left) - t.charAt(left));
                left++;
            }       // 记录此时窗口的大小
            res = Math.max(res, right -left);
        }
        return res;
    }
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
标题——作者——出处 基于蚁群优化算法递归神经网络的短期负荷预测 蚁群算法的小改进 基于蚁群算法的无人机任务规划 多态蚁群算法 MCM基板互连测试的单探针路径优化研究 改进的增强型蚁群算法 基于云模型理论的蚁群算法改进研究 基于禁忌搜索与蚁群最优结合算法的配电网规划 自适应蚁群算法在序列比对中的应用 基于蚁群算法的QoS多播路由优化算法 多目标优化问题的蚁群算法研究 多线程蚁群算法及其在最短路问题上的应用研究 改进的蚁群算法在2D HP模型中的应用 制造系统通用作业计划与蚁群算法优化 基于混合行为蚁群算法的研究 火力优化分配问题的小生境遗传蚂蚁算法 基于蚁群算法的对等网模拟器的设计与实现 基于粗粒度模型的蚁群优化并行算法 动态跃迁转移蚁群算法 基于人工免疫算法和蚁群算法求解旅行商问题 基于信息素异步更新的蚁群算法 用于连续函数优化的蚁群算法 求解复杂多阶段决策问题的动态窗口蚁群优化算法 蚁群算法在铸造生产配料优化中的应用 多阶段输电网络最优规划的并行蚁群算法 求解旅行商问题的混合粒子群优化算法 微粒群优化算法研究现状及其进展 随机摄动蚁群算法的收敛性及其数值特性分析 广义蚁群与粒子群结合算法在电力系统经济负荷分配中的应用 改进的蚁群算法及其在TSP中的应用研究 蚁群算法的全局收敛性研究及改进 房地产开发项目投资组合优化的改进蚁群算法 一种改进的蚁群算法用于灰色约束非线性规划问题求解 一种自适应蚁群算法及其仿真研究 一种动态自适应蚁群算法 蚂蚁群落优化算法在蛋白质折叠二维亲-疏水格点模型中的应用 用改进蚁群算法求解函数优化问题 连续优化问题的蚁群算法研究进展 蚁群算法概述 Ant colony system algorithm for the optimization of beer fermentation control 蚁群算法在K—TSP问题中的应用 Parallel ant colony algorithm and its application in the capacitated lot sizing problem for an agile supply chain 基于遗传蚁群算法的机器人全局路径规划研究 改进的蚁群算法在矿山物流配送路径优化中的研究 基于蚁群算法的配电网络综合优化方法 基于蚁群算法的分类规则挖掘算法 蚁群算法在连续性空间优化问题中的应用 蚁群算法在矿井通风系统优化设计中的应用 基于蚁群算法的液压土锚钻机动力头优化设计 改进蚁群算法设计拉式膜片弹簧 计算机科学技术 基本蚁群算法及其改进 TSP改进算法及在PCB数控加工刀具轨迹中的应用 可靠性优化的蚁群算法 对一类带聚类特征TSP问题的蚁群算法求解 蚁群算法理论及应用研究的进展 基于二进制编码的蚁群优化算法及其收敛性分析 蚁群算法的理论及其应用 基于蚁群行为仿真的影像纹理分类 启发式蚁群算法及其在高填石路堤稳定性分析中的应用 蚁群算法的研究现状 一种快速全局优化的改进蚁群算法及仿真 聚类问题的蚁群算法 蚁群最优化——模型、算法及应用综述 基于信息熵的改进蚁群算法及其应用 机载公共设备综合管理系统任务分配算法研究 基于改进蚁群算法的飞机低空突防航路规划 利用信息量留存的蚁群遗传算法 An Improved Heuristic Ant-Clustering Algorithm 改进型蚁群算法在内燃机径向滑动轴承优化设计中的应用 基于蚁群算法的PID参数优化 基于蚁群算法的复杂系统多故障状态的决策 蚁群算法在数据挖掘中的应用研究 基于蚁群算法的基因联接学习遗传算法 基于细粒度模型的并行蚁群优化算法 Binary-Coding-Based Ant Colony Optimization and Its Convergence 运载火箭控制系统漏电故障诊断研究 混沌扰动启发式蚁群算法及其在边坡非圆弧临界滑动面搜索中的应用 蚁群算法原理的仿真研究 Hopfield neural network based on ant system 蚁群算法及其实现方法研究 分层实体制造激光头切割路径的建模与优化 配送网络规划蚁群算法 基于蚁群算法的城域交通控制实时滚动优化 基于蚁群算法的复合形法及其在边坡稳定分析中的应用 Ant Colony Algorithm for Solving QoS Routing Problem 多产品间歇过程调度问题的建模与优化 基于蚁群算法的两地之间的最佳路径选择 蚁群算法求解问题时易产生的误区及对策 用双向收敛蚁群算法解作业车间调度问题 物流配送路径安排问题的混合蚁群算法 求解TSP问题的模式学习并行蚁群算法 基于蚁群算法的三维空间机器人路径规划 蚁群优化算法及其应用 蚁群算法不确定性分析 一种求解TSP问题的相遇蚁群算法 基于蚁群优化算法的彩色图像颜色聚类的研究 钣金件数控激光切割割嘴路径的优化 基于蚁群算法的图像分割方法 一种基于蚁群算法的聚类组合方法 圆排列问题的蚁群模拟退火算法 智能混合优化策略及其在流水作业调度中的应用 蚁群算法在QoS网络路由中的应用 一种改进的自适应路由算法 基于蚁群算法的煤炭运输优化方法 基于蚁群智能和支持向量机的人脸性别分类方法 蚁群算法在啤酒发酵控制优化中的应用 一种基于时延信息的多QoS快速自适应路由算法 蚁群算法中参数α、β、ρ设置的研究——以TSP问题为例 基于人工蚁群优化的矢量量化码书设计算法 具有自适应杂交特征的蚁群算法 蚁群算法在原料矿粉混匀优化中的应用 基于多Agent的蚁群算法在车间动态调度中的应用研究 用蚁群优化算法求解中国旅行商问题 蚁群算法在婴儿营养米粉配方中的应用 蚁群算法在机械优化设计中的应用 蚁群优化算法的研究现状及研究展望 蚁群优化算法及其应用研究进展 蚁群算法的理论与应用 简单蚁群算法的仿真分析 一种改进的蚁群算法求解最短路径问题 基于模式求解旅行商问题的蚁群算法 一种求解TSP的混合型蚁群算法 基于MATLAB的改进型基本蚁群算法 动态蚁群算法求解TSP问题 用蚁群算法求解类TSP问题的研究 蚁群算法求解连续空间优化问题的一种方法 用混合型蚂蚁群算法求解TSP问题 求解复杂TSP问题的随机扰动蚁群算法 基于蚁群算法的中国旅行商问题满意解 蚁群算法的研究现状和应用及蚂蚁智能体的硬件实现 蚁群算法概述 蚁群算法的研究现状及其展望 基于蚁群算法的配电网网架优化规划方法 用于一般函数优化的蚁群算法 协同模型与遗传算法的集成 基于蚁群最优的输电网络扩展规划 自适应蚁群算法 凸整数规划问题的混合蚁群算法 一种新的进化算法—蛟群算法 基于协同工作方式的一种蚁群布线系统
面向时间的滑动窗口算法是一种常用的时间序列数据处理方法,它可以对连续时间段内的数据进行统计和分析。其基本原理是将数据划分为固定长度的时间窗口,每个时间窗口都包含相同数量的数据点,然后通过移动时间窗口来实现对数据的连续处理。 下面是面向时间的滑动窗口算法原理图解释: 1. 数据分组:首先,将时间序列数据按照固定的时间间隔分组,并将每个时间间隔内的数据看作一个数据点。例如,如果时间间隔为10分钟,则将所有数据按照每10分钟为一个时间间隔进行分组。 2. 窗口设定:然后,将数据分组后的结果划分为固定长度的时间窗口,每个时间窗口包含相同数量的数据点。例如,如果每个时间窗口包含6个数据点,则将每个时间间隔中的前6个数据点放入第一个时间窗口,接下来的6个数据点放入第二个时间窗口,以此类推。 3. 统计分析:接着,对每个时间窗口内的数据进行统计分析,例如求出平均值、方差、最大值、最小值等指标,以及计算各种时间序列模型所需的特征值。 4. 窗口滑动:最后,将时间窗口向前滑动一个时间间隔,并对新的时间窗口中的数据进行处理,以此实现对数据的连续处理。 通过面向时间的滑动窗口算法,我们可以对时间序列数据进行连续的处理和分析,提取出数据中的规律和趋势,以便于后续的建模和预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值