查找最近N分钟内的请求数量?

时间:2013-10-20 16:06:31

标签: algorithm

假设我们维护一个网站,其中记录了所有请求。如何确定在任何时间点过去5分钟内发出的请求数量?

我可以在5分钟内找到解决方案。但不确定如何使其在任何时间间隔内都是通用的。

我的方法:

我们维护一个大小为300的数组。我们在数组中维护一个指针,该指针代表当前索引(每秒递增一次)。每当发出请求时,我们只返回指针所指的值。 要首先填充数组,所有值都是累积的。例如,第1秒的请求数为3,第2秒为5,第3秒为0 ...则数组看起来像是 3,8,8,0 .... 0,其中指针指向索引2。

(让我们快进4:59分钟并且数组的内容是) 3,8,8,......,180,0 其中ptr指的是索引298,因为我们还没有填充第299个索引。

现在假设在接下来的2秒内记录的请求数为5和2.数组看起来像:
3,8,8,............,180,185(5:00更新)
(185 + 2-3(oldvalue)),8,8,............,180,185 => 184,8,8,............,180,185(在5:01更新)
ptr指的是第0个索引。截至目前,在最后5分钟内提出的请求是否为184.

在类似的行上,我们应该能够在O(1)中的任何时间点返回值。

但是如何使解决方案通用?在某种意义上说,如果时间段是任意的,就像在最后10分钟内找到没有请求,在最后20分钟,在最后1分钟。 我认为我们可以利用分段树,但我们最终会修改每一秒的所有值,这将太昂贵。提出映射reduce pgm将是一个O(N)解决方案,只要发出getRequestsinLastNMins()请求就会触发pgm。但我正在寻找可以在O(1)中完成的事情。

0 个答案:

没有答案