我已经成功地创建了一个算法来检查一手牌的排名。它 100% 正确地工作,但速度很慢。我一直在分析代码,check straight 函数是其中最慢的部分之一。
所以我的问题是,有没有更好的方法来计算一手牌是否顺子?
这里是一些细节:
7 张牌,持有人 2 张,牌面 5 张。 A 可高可低。
每张卡片都分配了一个值: 2 = 2 3 = 3 .. 9 = 9 T = 10 J = 11 问 = 12 K = 13 A = 14
脚本有一个包含所有 7 张卡片的数组:
$cards = array(12,5,6,7,4,11,3);
所以现在我需要能够将它排序到一个数组中:
- 丢弃重复项
- 将卡片从低到高排序
- 只返回 5 张连续的卡片,即(3,4,5,6,7)
它需要快;循环和迭代非常昂贵。这是我目前使用的,当它试图分析 15000 手牌时,它会对脚本造成影响。
对于以上内容,我使用了:
- 丢弃重复项(使用 array_unique)
- 从低到高排序卡片(使用 sort())
- 只返回 5 张连续的卡片(使用 for 循环检查卡片的值)
有没有人有任何我可以改进的例子?甚至可以用另一种语言,我也许可以看看它是如何完成的?
最佳答案
与其使用数组重复数据删除和排序,不如考虑使用位掩码,并将设置卡值的位设置为 1。位掩码的工作方式类似于 Set 数据结构,并且在检测连续元素时具有额外的优势。
for ($i = 0; $i < count($cards); $i++) {
$card = $cards[$i];
// For each card value, set the bit
if ($card == 14) {
// If card is an ace, also set bit 1 for wheel
$cardBitmask |= 0x2;
}
$cardBitmask |= (1 << $card);
}
// To compare, you simply write a for loop checking for 5 consecutive bits
for($i = 10; $i > 0; $i--)
{
if ($cardBitmask & (0x1F << $i) == (0x1F << $i)) {
// Straight $i high was found!
}
}
关于php - 检查扑克直,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32896845/