假设我们每天都有日志文件的1e10
行,每个行包含:一个ID号(长度在15位以下的整数),一个登录时间和一个注销时间。某些ID可能会登录和注销多次。
问题1 :
如何计算已登录的ID总数(我们不应将每个ID计数两次或多次)
我在这里尝试使用哈希表,但发现应该获取的内存可能太大。
问题2 :
计算在线用户人数最多的时间。
我认为我们可以将一天中的时间分成86400秒,然后为日志文件的每一行在联机间隔中的每一秒加1。或者,也许我可以按登录时间对日志文件进行排序?
最佳答案
扫描日志中的所有登录事件。
要插入ID,请首先搜索包含ID的细分:如果存在,则ID是重复的。如果未搜索ID之前或之后的细分。如果存在,请删除它们并根据需要合并新的ID,然后插入新的细分。如果不存在,请将id插入1个元素的段中。
插入所有ID后,通过将树中所有段的基数相加来计算其编号。
给定的
扫描日志,并保留一个计数器
c
,其中包括当前登录用户的数量,找到的最大m
数量以及关联的时间t
。对于每个登录,递增c
,对于每个注销递减它。在每个步骤中,如果m
低于t
,则更新m
和c
。