我正在模拟扑克,现在我必须有效地对手牌进行排名:
每手牌是 5 张牌的组合,表示为uint64_t
。
从 0(黑桃 A)、1(红心 A)到 51(梅花二)的每一位表示相应的牌是手牌的一部分(位 == 1)还是不是手牌的一部分(位 == 0) . 从 52 到 63 的位总是设置为零并且不保存任何信息。
我已经知道我理论上如何生成一个表格,这样每一个有效的手都可以映射到uint16_t
1(2,3,4,5,7 - 不同颜色)和 7462(皇家同花顺)之间的范围(表示为 )和所有其他人到零距离。
因此,一个简单的查找表(以卡片的
整数值作为索引)将具有2 bytes * 2^52 >= 9.007 PB
.
大部分内存将被零填充,因为uint64_t
从 0 到 2^52-1 的几乎所有 ' 都是无效的手,因此范围等于零。
有价值的数据只占
2 bytes * 52!/(47!*5!) = 5.198 MB
.
我可以使用什么方法进行映射,这样我只需要从有效卡中保存排名和一些开销(最大 100 MB),并且仍然不必进行一些昂贵的搜索......它应该和可能的!
如果您有其他想法,欢迎您!;)