【发布时间】:2016-07-26 12:45:38
【问题描述】:
有这个很棒的帖子 https://stackoverflow.com/a/3143594/6589735 概述排名/未排名组合的算法。 此外,C++ 中有具体的实现,例如这里https://people.sc.fsu.edu/~jburkardt/cpp_src/combo/combo.cpp
我需要一个非常快的 C++ 实现,它在 x64 Haswell CPU 上对编码为 unsigned long long 的组合进行排名/取消排名。
我的尝试非常需要改进。
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屏蔽它们。 -
@FirstStep:我给出了一个算法的 C++ 实现。问题是:如何提高速度(执行时间)?
-
那你没找对地方。转至CodeReview
标签: c++ 64-bit combinations rank bitset