生成不是彼此镜像的排列

时间:2013-09-29 18:17:36

标签: c++ algorithm permutation combinatorics

我想生成n个数字的排列,其中没有两个排列是彼此的反转(第一个从最后一个字符读到第一个字符与第二个字符相同)。例如,n = 3,我想生成:

1 2 3 //but not 3 2 1
1 3 2 //but not 2 3 1
2 1 3 //but not 3 1 2

我不关心这两者中的哪一个会产生。该算法应适用于大n(> 20)。是否有任何此类算法或方法来检查生成的排列是否是先前生成的排列的镜像?

2 个答案:

答案 0 :(得分:7)

使用std::next_permutation并忽略第一个元素大于最后一个元素的排列。

答案 1 :(得分:1)

不,到目前为止,通过常用的硬件和软件,你不能这样做,因为这种排列的数量是20!/ 2> 10 ^ 10 * 2 ^ 20,意味着您需要多年才能生成它们。