假设我正在尝试为我的游戏创建某种匹配算法。该游戏类似于联赛或 DOTA,其中 5 名玩家对抗 5 名玩家。进一步假设玩家池是巨大的(数百万玩家同时搜索一个游戏),匹配器的工作是将尽可能多的玩家放入 5v5 游戏的许多实例中。在这一点上,我们完全不用担心 MMR、ELO 或任何玩家/队伍等级的影响。我们只想让玩家进入 5v5。
我目前的蛮力算法在缩放方面绝对是残酷的。它首先尝试在数百万玩家中找到 5 个玩家方的所有可能组合,然后,它尝试找到成对的方,如果玩家已经被使用,则从可能的方匹配中删除玩家:
所以,假设我有 10 个玩家,我想找到所有可能的 5v5,我首先将它们转换为位并进行位移以找到所有可能的组合。
Players: ABCDEFGHIJ
1111100000 => ABCDE
1111010000 => ABCDF
1111001000 => ABCDG
1111000100 => ABCDH
1111000010 => ABCDI
1111000001 => ABCDJ
1110110000 => ABCEF
等等...
然后在所有可能的参与方中,我使用 2 个 for 循环开始尝试查找参与方对:
ABCDE vs FGHIJ
ABCDF vs EGHIJ
ABCDG VS EFHIJ
等等...
该算法的运行时间为 O((nCr)^2)。因为它试图找到所有可能的派对组合,所以仅仅匹配 50 名玩家将需要 4.4891439e+12 次操作,这太疯狂了。
有什么更好的算法不会经过所有可能的参与方并蛮力解决这个问题?