我想有一种有效的方法来计算给定时间范围内重复事件的(近似)计数。
示例:我正在尝试从主机重复下载文件。它通常可以正常工作,但有时会在网络拥塞时发生错误。我不在乎这些单一的错误。不过,每隔一段时间,主机就会离线,所以我所有的尝试都失败了。在这种情况下,我想自动停止我的程序再次尝试。
所以我需要找出在过去 x 分钟内发生了多少错误。当数字低于某个阈值时,什么也不会发生。当它在上面时,我想采取行动。计数不一定要 100% 准确,只要准确到足以告诉我是否达到阈值即可。
一种简单但无效O(n)
(到达)。[旁白] 我想这就是 SQL 引擎对 a 所做的事情WHERE timestamp BETWEEN NOW() AND INTERVAL X MINUTES
,除非它们在列上有索引。[/在旁边]
我想要一个具有恒定 ( O(1)
) 复杂性的解决方案。到目前为止,我认为我会保留一个事件计数器,每次事件都会增加 1。我还将存储最近发生的时间戳。然后,当一个新事件发生时,通过一些数学魔法,我可以使用当前时间和存储的时间戳来减少计数器,以大致反映过去 x 分钟内发生了多少事件。
不幸的是,我的数学技能不能胜任这项任务。有人可以提供一些提示吗?