我设法创建了一个算法来检查扑克牌的排名.它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 举报,一经查实,本站将立刻删除。