我正在设计一个计算任意系统在线用户数量的Web服务。
输入数据是元组数组(user_id,log_in_time,log_out_time)。该服务应该以某种方式索引这些数据并准备数据结构,以便有效地回答表单的请求:“每个时间点(start_time,end_time)有多少用户在线?”。该服务的响应是一个数组 - 在请求的时间间隔内每个时间点的在线用户数。
并发症:每个用户都有一组特征(即年龄,性别,城市)。是否有可能有效地回答表单的请求:“有多少年龄= x,城市= y,性别= z的用户在(start_time,end_time)的每个时间点都在线?”
时间是整数(时间戳)。
答案 0 :(得分:1)
我不会完全回答这个问题,因为很明显这是一项家庭作业,但你并没有这样做。
假设时间窗口较小或该窗口内的同时在线用户数较少,只需解决第一个问题,然后按人口统计标准进行过滤。
如果同时在线用户的数量很大并且事后过滤过于耗时,那么先使用与boost::multi_index
类似的内容过滤最稀疏的维度,然后进行时间范围查询。< / p>
此外,大多数关系数据库都会开箱即用地执行这些类型的查询,因此最简单的解决方案是将数据存储在具有适当索引的数据库中,然后创建非常简单的查询。
由于您的评论说你不明白如何使用B-tree来进行范围查询,我会在答案中解释。您使用B树查找时间范围查询的最小值。 B树的结构方式是连续的叶子彼此相邻。首先对最小范围查询绑定进行对数查找。这会找到该时间范围内的第一个点。然后,从起点到超出范围查询的最大界限的点进行线性扫描。
这意味着使用B树会使您的查询O(log(number_of_online_users) + length_of_time_interval)
。