算法 – 在最后一分钟内计算活动用户的最快速/最简单的方法是什么?

栏目: 编程工具 · 发布时间: 5年前

内容简介:http://stackoverflow.com/questions/11039180/what-is-the-quickest-easiest-way-to-count-active-users-in-last-one-minute

你为Zynga工作,想要计算不同游戏当前活跃玩家的数量.您的Web服务器处理许多不同游戏的ping,每个用户都有一个唯一的GUID.必须能够一次查询一个游戏的活跃用户数.活跃的用户是最后一分钟得到ping的用户.

日志行连续进入Web服务器:

10.1.12.13 - - "http://zynga.com/ping?guid=<guid>&game=<gameID>" -

计算活跃用户的最快/最简单的方法是什么?

请用一些代码建议45分钟的答案.

我的版本

// web server interface, every time ping comes in count() will be called
// void count(String gameId, String guid)
// int getNumberActivePlayers(String gameId)

struct Record{
  String gameID;
  String guid;
};

class PingStorage{
private:
  max_heap<long, Record> storage;
public:
  //    O(log(n))
  //  n = total number of elements in storage
  void count(String gameId, String guid){
    long currentTimeStamp = getUnixTimeStamp();
    Record rec ;
    rec.gameId = gameId;
    rec.guid = guid;
    storage.add(currentTimeStamp, rec);
  }
  //N = numner of records in last ,minutes in storage
  //O(N)
  int getNumberActivePlayers(String gameId){
    map<String, Set<string> > game2user;
    long tillTimeStamp = getUnixTimeStampNow() - 60;
    while(true){
      pair<long, Record> rec = storage.getMax(); //O(1)
      if(rec.first <= tillTimeStamp) break;  
      Set<String> temp = game2user[rec.gameid]; //O(1)
      temp.add(rec.userid); //O(log(N)) - O(1)
    }
    return game2user[gameID].size();
  }
};

假设这是一个实时解决方案,您可以处理O(1)中的ping请求,在O(1)中生成当前播放器统计信息,并通过牺牲一些精度来使用O(num_player)空间.关键在于离散时间.

概观

基本思想是将离散时间间隔表示为对象,并将这些对象存储在以下属性中:在此时间间隔期间从未ping过的不同玩家的ping数.要查询活动用户的数量,请计算构成最后一分钟的最后x个时间间隔的加权和.

细节

首先,选择可接受的时间分辨率.在这个例子中,我选择15秒的间隔.

维护五个PingInterval数据结构,以代表其中五个间隔(跨越1个间隔超过1分钟). PingInterval包含一个属性:一个计数器.这些PingIntervals维护在PingMonitor中.每次播放器ping,更新PingMonitor内的映射,将每个播放器映射到当前时间间隔.执行此映射时,请执行以下步骤,以保持PingIntervals内的计数(根据概述部分中描述的特性).

>如果播放器已经映射到一个间隔,它是当前的间隔,什么都不做.

>否则,如果播放器映射到不是当前间隔的间隔,

>递减旧区间数,

>增加当前间隔的计数,

并将该播放器映射到该间隔.

否则,如果播放器没有被映射到间隔,

>增加当前间隔的计数,

>将播放器映射到当前间隔.

(如果PingInterval表示当前时间不存在,将最早的PingInterval设置为null,以线程安全的方式创建一个新的PingInterval,然后继续正常运行.)

当要查询活动用户数时,计算最后五个间隔时间间隔的时间加权和.例如,如果当前时间间隔只有5秒(意味着该间隔的未来10秒还没有发生),请计算此值:2/3 * 4个最新间隔的最早间隔和.

其他想法

五个间隔非常保守;我们可以大幅提高数量,以获得更高的准确性(也许每秒一次),而且仍然可以节省大量资金.重要的是我们的时代现在是离散的间隔.这意味着当我们去计算活跃用户的数量时,我们不必每个时间(等于用户数量);相反,我们可以看看我们预定义的x个时间段.

http://stackoverflow.com/questions/11039180/what-is-the-quickest-easiest-way-to-count-active-users-in-last-one-minute


以上所述就是小编给大家介绍的《算法 – 在最后一分钟内计算活动用户的最快速/最简单的方法是什么?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Fortran 95/2003程序设计

Fortran 95/2003程序设计

中国电力出版社 / 2009-8 / 88.00元

Fortran是计算世界最早出现的高级程序设计语言之一,随着面向对象编程时代的到来,Fortran语言不仅保持了发展的步伐,而且继续在科学计算方面领先。《Fortran95/2003程序设计(第3版)》在第2~7章介绍了Fortan语言基础知识,为初学者提供入门学习资料;在第8~15章介绍了Fortran语言高级特性,为深入用好Fortran语言提供支持;在第16章讲述了Fortran语言面向对象......一起来看看 《Fortran 95/2003程序设计》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具