我想根据百分比选择卡片的顶部“范围”。我将所有可能的 2 张牌按照牌的强度排列成一个数组,如下所示:
AA, KK, AKsuited, QQ, AKoff-suit ...
我通过将卡片数组的长度乘以百分比来挑选前 10% 的牌,这将给我数组中最后一张卡片的索引。然后我会复制子数组:
Arrays.copyOfRange(cardArray, 0, 16);
然而,我现在意识到这是不正确的,因为有更多可能的组合,比如 Ace King 非同花 - 12 种组合(即一个花色的 A 和另一个花色的 K)比有一个组合,比如说,a一对 A - 6 种组合。
当我选择前 10% 的手时,我希望它基于前 10% 的手与 2 张牌组合的总数成比例 - 52 选择 2 = 1326。
我想我可以有一个整数数组,其中每个索引保存到该点的所有组合的总和(每个索引将对应于原始数组中的一只手)。所以数组的前几个索引是:
6, 12, 16, 22
因为AA有6种组合,KK有6种组合,AKsuited有4种组合,QQ有6种组合。
然后我可以做一个在 BigOh(log n) 时间运行的二进制搜索。换句话说,我可以将组合总数 (1326) 乘以百分比,搜索小于或等于该数字的第一个索引,这将是我需要的原始数组的索引。
我想知道是否有办法可以在恒定时间内做到这一点?