php - 检查扑克直

标签 php arrays algorithm sorting poker

我已经成功地创建了一个算法来检查一手牌的排名。它 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/

相关文章:

PHP代码点火器: remove element from a two-dimensional column from its id

java - 我怎样才能得到一个方阵并将其放入另一个矩阵?

c# - (C#) - 将 Split 之间的每个单词存储在一个数组中

ruby - 按日期对哈希数组进行分组和求和

javascript - 根据属性名称对数组中的对象进行分组

php - 递归函数查找MySQL表的所有依赖项

java - Z 缓冲算法未 100% 正确绘制

php - MySQL,结合 DISTINCT 和 JOIN

php - 使用 if 语句更改 td 的颜色

php - 将 mySQL 行复制到具有不同名称的完全相同的表?