微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 直接检查扑克

我设法创建了一个算法来检查扑克牌的排名.它100%正确工作,但速度很慢.我一直在分析代码,而直接检查功能是其中最慢的部分之一.

所以我的问题是,有没有更好的方法来计算一只手是否伸直?

这是一些细节:

7张牌,2张牌,5张牌. A可以高或低.

每张卡都分配了一个值:
    2 = 2
    3 = 3
    ..
    9 = 9
    T = 10
    J = 11
    Q = 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!
    }
} 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐