这是分析扑克(特别是德州扑克)赔率的程序的一部分。我有一个我很满意的程序,但它需要一些小的优化才能完美。
我使用这种类型(当然还有其他):
type
T7Cards = array[0..6] of integer;
在决定如何对其进行排序时,有关此数组的两件事可能很重要:
- 每个项目都是从 0 到 51 的值。不可能有其他值。
- 没有重复项。绝不。
有了这些信息,对这个数组进行排序绝对最快的方法是什么?我使用 Delphi,所以 pascal 代码是最好的,但我可以阅读 C 和伪代码,尽管速度要慢一些 :-)
目前我使用快速排序,但有趣的是这几乎不比冒泡排序快!可能是因为项目数量少。排序占该方法总运行时间的近 50%。
编辑:
Mason Wheeler 询问为什么有必要进行优化。一个原因是该方法将被调用 2118760 次。
基本扑克信息:所有玩家都发两张牌(口袋),然后五张牌发到桌子上(前 3 被称为翻牌,接下来是转牌,最后是河牌。每个玩家挑选五个最好的牌组成他们的手)
如果口袋里有两张牌,P1 和 P2,我将使用以下循环来生成所有可能的组合:
for C1 := 0 to 51-4 do
if (C1<>P1) and (C1<>P2) then
for C2 := C1+1 to 51-3 do
if (C2<>P1) and (C2<>P2) then
for C3 := C2+1 to 51-2 do
if (C3<>P1) and (C3<>P2) then
for C4 := C3+1 to 51-1 do
if (C4<>P1) and (C4<>P2) then
for C5 := C4+1 to 51 do
if (C5<>P1) and (C5<>P2) then
begin
//This code will be executed 2 118 760 times
inc(ComboCounter[GetComboFromCards([P1,P2,C1,C2,C3,C4,C5])]);
end;
在我写这篇文章时,我还注意到一件事:数组的最后五个元素总是被排序的,所以这只是将前两个元素放在数组中正确位置的问题。这应该会简化一些事情。
所以,新的问题是:当最后 5 个元素已经排序时,对 7 个整数的数组进行排序的最快方法是什么?我相信这可以通过几个(?)if's和swaps来解决:-)