首页 > 试题广场 >

请统计一天内一直处于不活跃状态的玩家的百分比

[问答题]
某游戏的客户端每隔5分钟会向服务端报告一次玩家的账户积分,如果两次报告的时间间隔不大于5分钟,认为该玩家在这5分钟内在线,假设报告数据的格式如下:
IP                   Datetime                Score
223.152.112.238      2014-08-22 12:01:35     54232

现有一天的数据,按时间按序保存,粗略估计玩家数在百万左右,请使用尽量少的硬件资源完成以下请求,用代码,伪代码或其他你觉得可以表述清楚的方式描述你的方法。统计在线时长最长的十个玩家;如果玩家两次提交的积分相同,认为玩家在5min的在线时间内不活跃,请统计一天内一直处于不活跃状态的玩家的百分比。(注:积分可增可减)
内存数据结构:
HashMap: key: char[16] ip
     value: struct { min_score int,
             max_score int,
             last_time int,
             continue_time int
           }
解释:以ip为key,占16字节,value中min_score为这一天最小分数;max_socre为最大;last_time为上一次扫描到的时间,这里将时间转换成整型,因是一天数据,一天可以划分为24*60=1440个分片;continue_time为持续时间,以分片数记,最大为1440。这样内存中数据最大是(16 + 4 + 4 + 4 + 4) * 1000000/1000/1000=32MB
执行过程:
因是已按时间排序的,所以只需要一次顺序扫描即可。最后取continue_time最大10个,min_score==max_score的为不活跃玩家

    
发表于 2015-05-26 21:12:09 回复(5)
Xxx
发表于 2015-10-16 10:01:27 回复(0)