我能在这里做二分搜索吗?

时间:2011-12-22 14:02:10

标签: algorithm binary-search poker

我想根据百分比选择卡片的顶级“范围”。我按照手的力量顺序排列了所有可能的2张牌,如下所示:

AA, KK, AKsuited, QQ, AKoff-suit ...

我通过将卡阵列的长度乘以百分比来挑选前10%的牌,这将给出数组中最后一张牌的索引。然后我会复制一个子数组:

Arrays.copyOfRange(cardArray, 0, 16);

然而,我现在意识到这是不正确的,因为有更多可能的组合,比如,Ace King off-suit - 12种组合(即一件西装的ace和另一套西装的王牌),而不是组合,比方说,一对A - 6种组合。

当我选择前10%的牌时,我希望它基于前10%的牌数与2张牌组合的总数成比例--52选择2 = 1326.

我以为我可以有一个整数数组,其中每个索引保持所有组合的总和直到该点(每个索引对应于原始数组中的一个手)。所以数组的前几个索引是:

6, 12, 16, 22

因为有6种组合的AA,6种KK组合,4种组合的AKsuited,6种组合的QQ。

然后我可以进行在BigOh(log n)时间运行的二进制搜索。换句话说,我可以将组合总数(1326)乘以百分比,搜索低于或等于此数字的第一个索引,这将是我需要的原始数组的索引。

我想知道是否有办法可以在不变的时间内完成这项工作?

2 个答案:

答案 0 :(得分:3)

正如Groo建议的那样,如果预计算和内存开销允许,创建6个AA副本,6个KK副本等并将它们存储到排序数组中会更有效。然后,您可以在此正确加权的列表上运行原始算法。

如果查询数量很大,这是最好的。

否则,我不认为你可以为每个查询获得恒定的时间。这是因为查询取决于整个频率分布。您不能仅查看恒定数量的元素,并确定它是否是正确的百分位数。

答案 1 :(得分:1)

在这里进行了类似的讨论Algorithm for picking thumbed-up items作为对我的回答的评论(基本上你想对你的名单做些什么),有人建议了一个特定的数据结构,http://en.wikipedia.org/wiki/Fenwick_tree

另外,请确保您的数据结构能够有效访问前5%和15%之间的范围(不过与编码相关的提示;)。