Как проще всего подсчитать активных пользователей за последнюю минуту?

Вы работаете в Zynga и хотите подсчитать количество активных в данный момент игроков в различных играх. Ваш веб-сервер обрабатывает эхо-запросы из разных игр, и каждый пользователь имеет уникальный идентификатор GUID. Должна быть возможность запрашивать количество активных пользователей для одной игры за раз. Активные пользователи — это те, кто получил пинг в последнюю минуту.

Строки журнала постоянно поступают на веб-сервер:

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();
  }
};
15
задан moooeeeep 14 June 2012 в 18:44
поделиться