【发布时间】:2013-09-04 14:12:52
【问题描述】:
我想要一种有效的方法来计算给定时间范围内重复事件的(近似)计数。
示例: 我正在尝试从主机重复下载文件。它通常可以正常工作,但有时会在网络拥塞时发生错误。我不在乎这些单一的错误。不过,每隔一段时间,主机就会离线,所以我所有的尝试都失败了。在这种情况下,我想自动停止我的程序重试。
所以我需要找出在过去 x 分钟内发生了多少错误。当数字低于某个阈值时,什么也不会发生。当它在上面时,我想采取行动。计数不必 100% 准确,只要准确到足以告诉我是否达到阈值即可。
一个简单但无效 (O(n)) 的方法是只存储事件的时间戳,然后对于每个新事件,通过迭代它们并比较时间戳来确定先前事件的数量 (直到达到时间框架)。 [旁白] 我想这就是 SQL 引擎对WHERE timestamp BETWEEN NOW() AND INTERVAL X MINUTES 所做的事情,除非它们在列上有索引。 [/旁白]
我想要一个具有恒定 (O(1)) 复杂性的解决方案。到目前为止,我认为我会保留一个事件计数器,每次事件都会增加 1。我还将存储最近发生的时间戳。然后,当一个新事件发生时,通过一些数学魔法,我可以使用当前时间和存储的时间戳来减少计数器,以大致反映过去 x 分钟内发生了多少事件。
很遗憾,我的数学技能无法胜任这项任务。有人可以提供一些提示吗?
【问题讨论】:
-
相关 - Design a datastructure to return the number of connections to a web server in last 1 minute。如果间隔是固定的,您可以使用基于队列的方法。如果间隔的选项数量很少,则可以有多个指针进入队列,每个间隔一个。或者基于计数的方法应该有效。
-
对于程序的特定运行来说,“X 分钟”是常数吗?或者您是否有时想知道过去 10 分钟内发生了多少错误,而其他时候想知道过去 30 分钟内发生了多少错误?
-
x 是一个常数。但是,需要在不同的时间范围内跟踪不同类型的事件。
标签: algorithm math data-structures