经典指数          
原因
1461
浏览数
0
收藏数
 

某游戏的客户端每隔5分钟会向服务端报告一次玩家的账户积分,如果两次报告的时间间隔不大于5分钟,认为该玩家在这5分钟内在线,假设报告数据的格式如下: IP                   Datetime                Score 223.152.112.238      2014-08-22 12:01:35     54232 现有一天的数据,按时间按序保存,粗略估计玩家数在百万左右,请使用尽量少的硬件资源完成以下请求,用代码,伪代码或其他你觉得可以表述清楚的方式描述你的方法。统计在线时长最长的十个玩家;如果玩家两次提交的积分相同,认为玩家在5min的在线时间内不活跃,请统计一天内一直处于不活跃状态的玩家的百分比。(注:积分可增可减)

     举报   纠错  
 
切换
1 个答案

内存数据结构:

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的为不活跃玩家

    

 
切换
撰写答案