面试冲刺:09---设计一个算法统计一个论坛中用户的在线分布情况(取样粒度为秒)

一、题目描述

  • 有一个论坛,其注册ID有两亿个,每个ID登陆和退出都会向日志中写入登陆和退出的时间
  • 现要求:写一个算法统计一天中论坛的用户在线分布(取样粒度为秒),也就是在指定秒

二、解析

  • 因为每一秒钟可能会有很多的用户不提的退出与登录,因此不能简单的将前一秒的在线人数“加上当前秒的登录人数”或者“减去当前秒的退出人数”

三、答案

  • 第一步:一天总共有 3600*24=86400 秒
  • 第二步:定义一个长度为 86400 的整数数组int delta[86400],每个索引对应这一秒的人数变化值,也就是该秒登陆人数与退出人数的差值(因此可能为正也可能为负)
  • 第三步:开始时将数组元素都初始化为 0,然后依次读入每个用户的登录时间和退出时间
    • 找到这个用户的登陆时间对应在一天中的秒数,然后将delta数组对应的索引处值加1
    • ​​​​​​​找到这个用户的退出时间对应在一天中的秒数,然后将delta数组对应的索引处值减1
  • 第四步:这样处理一遍后delta数组中存储了每秒中的人数变化情况(可为正可为负)
  • 第五步:定义另外一个长度为 86400 的整数数组 int online_num[86400],每个整数对应这一秒的论坛在线人数
  • 第六步:假设一天开始时论坛在线人数为 0,则:
    • 第1秒的人数online_num[0] = delta[0]
    • 第2秒的人数online_num[1] = online_num[0] + delta[1](如果delta[1]为负,则分布线下降(在线人数变少);如果delta[1]为正,则分布线上升(在线人数变多))
    • ......以此类推
    • 第n+1秒的人数online_num[n] = online_num[n-1] + delta[n]
  • 这样我们就获得了一天中任意时间的在线人数

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/107724059