2

我有一个游戏,可以由相互竞争的用户组玩。这样的团体数量很少,不到10个。玩家的数量是数千人。

当用户购买票时,会为他分配一个组。目前,将一个组分配给一个玩家是随机完成的,但这可能导致一个组中有很多玩家而其他组中的玩家很少。

我遇到的问题是如何分配组号以使组具有可比较的大小。

4

3 回答 3

2

保留一个HashMap<Integer, List<Group>>, 键入相关组的大小。每个人都从零成员开始。从您拥有的最小的非空大小括号顶部弹出一个组,将新成员添加到其中,然后将其推到下一个最大的大小。

你可以 O(n)创建它,O(1)推送和弹出一个组,O(1)如果你在调用之间保持缓存,你可以找到最小的组,只要你当前的组用完就找到下一个。

于 2014-06-25T20:08:16.343 回答
1

组的某些子集当前将具有最小大小。(这可以是整组组,如果所有组都具有相同的大小。)从这组最小大小组中,随机选择一个,并将新玩家添加到其中。

如果您从一开始就遵循此策略,那么任何两个组的大小差异都不会超过 1。这是可实现的最坏情况下的最小大小差异。

于 2014-06-25T20:05:09.290 回答
1

像这样的东西怎么样:

GroupManager::AssignGroup(Player player)
{
   groupAssignments[groupIndex].add(player); 
   groupIndex++; 
   if ( groupIndex == GROUP_MAX )
      groupIndex == 0; 
}
于 2014-06-25T20:20:06.050 回答