これは、ポーカー、特にテキサス ホールデムのオッズを分析するプログラムの一部です。私は満足しているプログラムを持っていますが、完璧にするためにいくつかの小さな最適化が必要です。
私はこのタイプを使用します(もちろん、とりわけ):
type
T7Cards = array[0..6] of integer;
この配列について、並べ替え方法を決定する際に重要となることが 2 つあります。
- すべての項目は 0 から 51 までの値です。他の値は使用できません。
- 重複はありません。一度もない。
この情報を使用して、この配列をソートする絶対に最速の方法は何ですか? 私は Delphi を使用しているので、パスカル コードが最適ですが、C と疑似コードを読むことはできますが、少し遅くなります :-)
現時点ではクイックソートを使用していますが、面白いことに、これはバブルソートよりもほとんど高速ではありません! 個数が少ないため可能です。並べ替えは、メソッドの合計実行時間のほぼ 50% を占めます。
編集:
Mason Wheeler は、最適化が必要な理由を尋ねました。1 つの理由は、メソッドが 2118760 回呼び出されることです。
ポーカーの基本情報: すべてのプレイヤーに 2 枚のカード (ポケット) が配られ、次に 5 枚のカードがテーブルに配られます (最初の 3 枚はフロップ、次はターン、最後はリバーと呼ばれます。各プレイヤーは最高の 5 枚を選びます。ハンドを構成するカード)
ポケットに P1 と P2 の 2 枚のカードがある場合、次のループを使用して、考えられるすべての組み合わせを生成します。
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;
これを書いているとき、もう 1 つのことに気付きました。配列の最後の 5 つの要素は常にソートされるため、最初の 2 つの要素を配列の正しい位置に配置するだけの問題です。それは問題を少し単純化するはずです。
したがって、新しい質問は次のとおりです。最後の 5 つの要素が既に並べ替えられている場合に、7 つの整数の配列を並べ替える最速の方法は何ですか。これは、いくつか (?) の if と swap で解決できると思います :-)