You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算过去60秒内的温度最小值与最大值(内存受限场景)

这是个很典型的内存受限场景下的滑动窗口极值问题,我来给你几个实用的思路,完全符合你不能用数组存储所有采样的约束:

1. 时间片聚合跟踪法(内存友好,精度可控)

既然60秒对应600个采样点,直接存所有数据肯定不行,那我们可以把大窗口拆成多个小时间片,每个时间片只存该时间段内的最小值和最大值,而不是单个采样:

  • 比如把60秒拆成30个2秒的时间片(每个时间片包含20个采样),总共只需要维护30组(时间片起始时间, min_temp, max_temp)的数据——哪怕用链表存储这些组,内存占用也比存600个采样小得多
  • 每次新采样进来时,更新当前所在时间片的min_temp和max_temp;当时间走到下一个时间片时,把当前时间片的极值数据存入链表,同时移除所有超过60秒的旧时间片
  • 用户发起查询时,遍历所有在60秒窗口内的时间片,取所有min_temp里的最小值、所有max_temp里的最大值,就是最终结果

这个方法的好处是内存占用极低,计算逻辑简单;唯一需要注意的是时间片的划分——如果你的场景对精度要求极高,可以把时间片设得更小(比如1秒),内存占用依然远低于存所有采样。

2. 单调队列+时间戳(精确极值,内存优化)

如果必须要精确的极值结果,不能有时间片聚合的误差,那可以用两个单调队列分别跟踪最大值和最小值,每个队列元素只存(温度值, 时间戳):

  • 最大值队列逻辑:
    1. 新采样进来时,先把队列里所有时间戳早于「当前时间-60秒」的元素全部移除(这些已经超出窗口了)
    2. 从队列尾部开始,把所有温度值小于当前采样的元素移除——因为这些元素的存在时间比当前采样短,温度还更低,不可能成为后续任何窗口的最大值
    3. 把当前采样的温度和时间戳加入队列尾部,此时队列的队首就是当前60秒窗口的最大值
  • 最小值队列逻辑:
    步骤和最大值队列类似,只是第二步要移除尾部所有温度值大于当前采样的元素,队首就是当前窗口的最小值

这里的关键是,单调队列不需要存储所有600个采样点,只保留那些有可能成为未来窗口极值的点。比如如果温度持续上升,最大值队列里只会有最后一个采样;就算温度波动频繁,队列大小也远小于600。如果严格不能用数组实现队列,用链表来做完全没问题,内存占用依然可控。

3. 极端内存受限下的近似极值法

如果你的内存真的紧张到只能用几个变量,那可以用这种牺牲一点点精度的方法:

  • 维护current_min、current_max以及它们的时间戳,同时维护second_min、second_max(次极值)和对应的时间戳
  • 每次新采样进来时,更新这四个值:如果新采样比current_min小,就把原来的current_min降级为second_min,新采样成为current_min;最大值逻辑同理
  • 当current_min的时间戳超出60秒时,把second_min升级为新的current_min,然后在后续采样中重新收集新的second_min

这个方法的缺点是偶尔会有短暂的精度误差(比如原来的最大值过期后,次最大值可能不是当前窗口的真正最大值),但因为采样频率很高(100ms一次),误差持续时间极短,适合对精度要求不是极端严格的场景。


内容的提问来源于stack exchange,提问作者litun bls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:49:05