滑动窗口最大值:单调队列精解

单调队列的定义与特点

单调队列是一种特殊的队列数据结构,保证队列中的元素始终按照某种单调性(递增或递减)排列。与普通队列不同,单调队列在插入新元素时会移除破坏单调性的元素,从而高效维护队列的单调性。

单调队列的核心操作

初始化
通常使用双端队列(如C++的deque)实现,方便两端操作。

插入元素
以维护递减队列为例:

  1. 从队尾开始,移除所有小于当前待插入元素的队尾元素。
  2. 将新元素插入队尾。
    例如插入元素x的伪代码:
while (!dq.empty() && dq.back() < x) dq.pop_back();
dq.push_back(x);

删除元素
若队首元素超出滑动窗口范围或其他条件,需移除队首元素:

if (!dq.empty() && dq.front() == out_of_range_value) dq.pop_front();

典型应用场景

滑动窗口最大值
问题描述:给定数组和窗口大小k,返回每个窗口的最大值。
解法:

  1. 维护递减单调队列,队首即为当前窗口最大值。
  2. 滑动窗口时,移除左边界元素(若等于队首),并插入新元素。
def maxSlidingWindow(nums, k):
    from collections import deque
    dq = deque()
    res = []
    for i, num in enumerate(nums):
        while dq and nums[dq[-1]] < num:
            dq.pop()
        dq.append(i)
        if dq[0] == i - k:
            dq.popleft()
        if i >= k - 1:
            res.append(nums[dq[0]])
    return res

优化动态规划问题
在某些DP问题中,单调队列可以优化状态转移。例如:

  • 问题:dp[i] = max(dp[j] + f(i-j)),其中j在某个区间内。
  • 优化:用单调队列维护dp[j] + f(i-j)的极值,避免重复计算。

复杂度分析

  • 时间复杂度:每个元素最多入队和出队一次,均摊复杂度为$O(n)$。
  • 空间复杂度:$O(k)$,其中$k$为队列最大长度(如滑动窗口大小)。

注意事项

  • 边界处理:需检查队列是否为空再进行操作。
  • 元素重复:若存在重复值,队列中存储下标而非值,避免误删。
  • 单调性选择:根据问题需求选择递增或递减队列。
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制方法。通过结合数据驱动技术与Koopman算子理论,将非线性系统动态近似为高维线性系统,进而利用递归神经网络(RNN)建模并实现系统行为的确预测。文中详细阐述了模型构建流程、线性化策略及在预测控制中的集成应用,并提供了完整的Matlab代码实现,便于科研人员复现实验、优化算法并拓展至其他密控制系统。该方法有效提升了纳米级定位系统的控制度与动态响应性能。; 适合人群:具备自动控制、机器学习或信号处理背景,熟悉Matlab编程,从事密仪器控制、智能制造或先进控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①实现非线性动态系统的数据驱动线性化建模;②提升纳米定位平台的轨迹跟踪与预测控制性能;③为高度控制系统提供可复现的Koopman-RNN融合决方案; 阅读建议:建议结合Matlab代码逐段理算法实现细节,重点关注Koopman观测矩阵构造、RNN训练流程与模型预测控制器(MPC)的集成方式,鼓励在实际硬件平台上验证并调整参数以适应具体应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值