ランキングが高い順/ランキングのアルゴリズムの概要を示す https://stackoverflow.com/a/3143594/6589735 また、C++には具体的な実装があります。ここhttps://people.sc.fsu.edu/~jburkardt/cpp_src/combo/combo.cpp組み合わせのランキング(ランキング64.4)
私は、x64ハスウェルCPUにunsigned long long
としてエンコードランク/ unrank組み合わせを行うC++で非常に高速実装を必要としています。
私の試みは、改善が非常に必要です。
unsigned long long rank(unsigned long long comb, int card)
{
unsigned long long rank = 0;
for (int i = 1; i <= card; i++)
{
unsigned long index;
_BitScanForward64(&index, comb);
rank += binCoef[index][i]; // the binCoef table is precomputed
comb &= (comb - 1);
}
return rank;
}
unsigned long long unrank(unsigned long long rank, int card)
{
unsigned long long comb = 0;
unsigned long long m = rank;
for (int i = card - 1; i >= 0; i--)
{
int p = i;
while (binCoef[p + 1][i + 1] <= m)
p++;
m -= binCoef[p][i + 1];
comb |= (1 << p);
}
return comb;
}
申し訳ありませんが、あなたの偉大な質問は何ですか? –
@MSalters:C言語に変更された言語 –
あなたはあらかじめ計算しているので、ビットマスクのすべての可能なバイトの合計など、あらかじめ計算しておくことができます。その後、ビットをループする代わりに 'pdep'でマスクしてください。 – harold