【发布时间】:2013-11-10 11:27:28
【问题描述】:
我正在模拟扑克,现在我必须有效地对手牌进行排名:
每手牌是 5 张牌的组合,表示为 uint64_t。
从 0(黑桃 A)、1(红心 A)到 51(梅花二)的每一位表示对应的牌是手牌的一部分(位 == 1)还是不是手牌的一部分(位 == 0) .从 52 到 63 的位总是设置为零并且不保存任何信息。
我已经知道理论上如何生成表格,以便每只有效手都可以映射到 1 之间的范围(表示为 uint16_t)(2、3、4、5、7 - 不同颜色)和7462(皇家同花顺)和所有其他人到零。
因此,一个简单的查找表(以卡片的整数值作为索引)的大小巨大为
2 bytes * 2^52 >= 9.007 PB.
大部分内存将被零填充,因为从 0 到 2^52-1 的几乎所有uint64_t 都是无效手,因此范围等于零。
有价值的数据只占
2 bytes * 52!/(47!*5!) = 5.198 MB.
我可以使用什么方法进行映射,这样我只需要保存有效卡片中的排名和一些开销(最大 100 MB),并且仍然不必进行一些昂贵的搜索... 它应该尽可能快!
如果您有任何其他想法,欢迎您! ;)
【问题讨论】:
-
试试哈希表。构建它会很慢,所以构建一次并保存在一个文件中。
-
有趣的是,您认为只有某些卡是有效的。大多数扑克牌的等级基于 5 张牌(也许全部?)...不管这 5 张牌是什么,每张牌都是有效的。如果您的手牌只有一对二,那么其他三张牌仍然是手牌的有效部分(仅在面对另一对二时才有意义)。
-
@mah 这不是有效与否的卡片,而是他描述的编码所代表的手。正如你所说,扑克手通常是 5 张牌;但是使用这种编码,您可以轻松地表示从 0 到 52 的任意数量的牌。这是 OP 所指的空间浪费。
-
小步骤想法:让位标志存在于每套花色的 16 位边界上。 bit0-ASpades, bit1-2Spaces .... bit16-AClubs ...这可能会使花色之间的位操作更容易。
-
位图表示很好,但并不理想。我在 github.com/ojcardlib 中使用了一个更简单的 5 整数表示,它的扑克手评估器是 5 表查找,表只有大约 1MB。
标签: c lookup lookup-tables poker