我有一个游戏,可以由相互竞争的用户组玩。这样的团体数量很少,不到10个。玩家的数量是数千人。
当用户购买票时,会为他分配一个组。目前,将一个组分配给一个玩家是随机完成的,但这可能导致一个组中有很多玩家而其他组中的玩家很少。
我遇到的问题是如何分配组号以使组具有可比较的大小。
我有一个游戏,可以由相互竞争的用户组玩。这样的团体数量很少,不到10个。玩家的数量是数千人。
当用户购买票时,会为他分配一个组。目前,将一个组分配给一个玩家是随机完成的,但这可能导致一个组中有很多玩家而其他组中的玩家很少。
我遇到的问题是如何分配组号以使组具有可比较的大小。
保留一个HashMap<Integer, List<Group>>, 键入相关组的大小。每个人都从零成员开始。从您拥有的最小的非空大小括号顶部弹出一个组,将新成员添加到其中,然后将其推到下一个最大的大小。
你可以 O(n)创建它,O(1)推送和弹出一个组,O(1)如果你在调用之间保持缓存,你可以找到最小的组,只要你当前的组用完就找到下一个。
组的某些子集当前将具有最小大小。(这可以是整组组,如果所有组都具有相同的大小。)从这组最小大小组中,随机选择一个,并将新玩家添加到其中。
如果您从一开始就遵循此策略,那么任何两个组的大小差异都不会超过 1。这是可实现的最坏情况下的最小大小差异。
像这样的东西怎么样:
GroupManager::AssignGroup(Player player)
{
groupAssignments[groupIndex].add(player);
groupIndex++;
if ( groupIndex == GROUP_MAX )
groupIndex == 0;
}