O(1)时空实时统计

时间:2018-09-06 09:17:11

标签: algorithm rest caching statistics

我最近提交了一份关于工作职位的代码挑战。 应该将事务发布到REST服务上,如下所示:

POST /交易

{
   "amout" : "10.12"
   "timestamp" : "2018-09-25T12:00:00
}

和GET / statistics,响应如下:

{
  "count" : "3"
  "min" : "100.00"
  "max" : "200.00"
  "sum" : "450.00"
  "avg" : "150.00"
}

使解决方案难以解决的约束因素是:

1.-它不应使用SQL来存储事务,因此它基本上是内存中事务缓存。

2.-对于时间和辅助空间,它都应始终在O(1)中执行

3.-计划的清理还不够。

4.-仅应考虑从发出请求后的最后60秒内提交的事务以进行统计。

我的第一种方法是为每笔交易或查询更新缓存的当前服务器分钟作为ID为统计信息生成一个包装器,但这失败了,因为它仅处理当前的分钟交易,在60秒内取消了交易,但从上次开始分钟。

我想出的所有其他方法都需要某种迭代,这会及时违反O(1)约束,最后我被拒绝了,但我想向社区学习什么是最好的方法。

欢呼声

1 个答案:

答案 0 :(得分:1)

似乎时间戳只有1秒的分辨率,因此您可以保留每1秒间隔的统计信息。处理GET请求时,您需要合并60个间隔中的统计信息。

但是就大O而言,O(60)和O(1)是同一件事。换句话说,如果您处理了1000万个POST事务,同时仅保留60组统计信息,那么您就满足了O(1)的空间和时间要求。也就是说,只要迭代次数不取决于事务数,就可以进行一些迭代。

每隔一小时一分钟将其映射到一个统计对象,无论收到多少POST事务,该GET请求最多可以处理60次迭代。