假设我们每天都有日志文件的1e10行,每个行包含:一个ID号(长度在15位以下的整数),一个登录时间和一个注销时间。某些ID可能会登录和注销多次。

问题1 :

如何计算已登录的ID总数(我们不应将每个ID计数两次或多次)

我在这里尝试使用哈希表,但发现应该获取的内存可能太大。

问题2 :

计算在线用户人数最多的时间。

我认为我们可以将一天中的时间分成86400秒,然后为日志文件的每一行在联机间隔中的每一秒加1。或者,也许我可以按登录时间对日志文件进行排序?

最佳答案

  • 使用segment tree存储连续ID的间隔。
    扫描日志中的所有登录事件。
    要插入ID,请首先搜索包含ID的细分:如果存在,则ID是重复的。如果未搜索ID之前或之后的细分。如果存在,请删除它们并根据需要合并新的ID,然后插入新的细分。如果不存在,请将id插入1个元素的段中。

    插入所有ID后,通过将树中所有段的基数相加来计算其编号。
  • 假设:

    给定的
  • 在任何给定的时间
  • 只能登录一次
  • 事件按时间顺序存储(通常是日志)

  • 扫描日志,并保留一个计数器c,其中包括当前登录用户的数量,找到的最大m数量以及关联的时间t。对于每个登录,递增c,对于每个注销递减它。在每个步骤中,如果m低于t,则更新mc

    10-04 21:46
    查看更多