class FastPermutation
{
public:
typedef function<void(int*)> ENUMERATOR;
static void Enum(int base, ENUMERATOR enumerator)
{
FastPermutation permutation;
permutation.CalculateAtLevel(base, enumerator);
}
private:
void CalculateAtLevel(int level, ENUMERATOR enumerator)
{
if (level == 1)
{
int sequence[] = { 0 };
enumerator(sequence);
return;
}
int* sequence = new int[level];
this->CalculateAtLevel(level - 1, [level, sequence, enumerator](int* s)
{
int* key = sequence + (level - 1);
*key = level - 1;
for (int i = 0; i < level - 1; i++) sequence[i] = s[i];
enumerator(sequence);
while (key != sequence)
{
*key = *(key - 1);
*(--key) = level - 1;
enumerator(sequence);
}
});
delete[] sequence;
}
};
经测试,效率和STL中的next_permutation是完全一样的。
高效Permutation算法
最新推荐文章于 2021-08-24 19:05:36 发布