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!
    }
} 

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...