跟踪请求数

时间:2017-08-09 04:33:13

标签: algorithm

我有一个api,用于注册req,每个req是在一个商店出售金额。 恩。
销售:{时间戳:23212312312
金额:500英镑}

然后我有一个函数统计信息,负责向我提供过去60秒内完成的销售的详细信息。 统计数据将返回: 平均值:过去60秒内完成的所有销售额的平均值 min:过去60年内完成的最小销售额 最大:最大金额
总和:过去60秒内所有销售额的总和
count:过去60年代完成的销售数量

此功能在空间和时间上应为O(1)。现在,如果我们忽略空间需求,是否应该使用链表来存储过去60年代发生的销售并不断更新?或者应该在调用统计函数时更新它。如何在O(1)空间中完成?

我的解决方案: 这是我解决这个问题的方法: 每次我们卖东西时都会将该项添加到链接列表中。 由于java链表具有指向第一个和最后一个元素的指针,因此第一个元素将指向从现在起60秒发生的第一个销售。当我们进行销售时,我们从列表的开头删除元素,直到我们在60s的时间范围内。当我们调用统计数据时,我们采用当前时间 - 60秒来查找时间戳并使用它来从列表的开头删除元素。但是什么时候计算min,max avg和sum我需要遍历list =>空间和时间都是O(n)。

1 个答案:

答案 0 :(得分:2)

一种方法是将间隔分为1秒"桶"。 1 每个桶可以包含计数,总和,最小值和最大值。每次报告新的销售时,请更新时间戳的相应存储桶。进行统计查询时,聚合存储桶以获取总计数,总和等。此外,对于每个API调用(更新或查询),丢弃任何超过60秒的存储桶并创建新的空存储桶以替换它们。 / p>

如果我们想要将桶数包括为参数k,除了销售数量n之外,那么更新单个存储桶为O(1)并且查询统计信息为{{ 1}}。在一个简单的实现中更新桶列表是O(k),但这可以通过仅在访问时更新每个桶来避免。空间要求为O(k)

对于任何固定数量的存储桶,无论销量如何,每次操作的时间和空间复杂度都会降低O(k)

1 您可以调整铲斗间隔以在精度和计算时间之间进行权衡。

相关问题