我想知道是否有一种简单的方法可以知道c ++' std::next_permutation
根据创建它们的顺序创建的排列的parity(签名)。< / p>
int main()
{
int counter = 0;
std::vector<int> mask {0, 1, 2, 3, 4};
do
{
counter++;
// then determine the parity of permutation from knowledge of the counter
} while (std::next_permutation(mask.begin(), mask.end()));
}
或者,是否有内置函数来确定置换的奇偶性?
答案 0 :(得分:0)
编辑:以下规则是错误的。我试图修复它。
这里似乎有一个很好的组合奇迹!如果您按字典顺序枚举排列(由C ++标准指定,请参见例如:http://en.cppreference.com/w/cpp/algorithm/next_permutation),那么某些实验似乎表明符号遵循以下规则: 从一开始,然后改变符号,然后每隔一个排列改变符号。
[1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1 ...]
我目前不明白为什么,但我检查过这是真的大小***。例如,这里是n = 4:
([1, 2, 3, 4], 1)
([1, 2, 4, 3], -1)
([1, 3, 2, 4], -1)
([1, 3, 4, 2], 1)
([1, 4, 2, 3], 1)
([1, 4, 3, 2], -1)
([2, 1, 3, 4], -1)
([2, 1, 4, 3], 1)
([2, 3, 1, 4], 1)
([2, 3, 4, 1], -1)
([2, 4, 1, 3], -1)
([2, 4, 3, 1], 1)
([3, 1, 2, 4], 1)
([3, 1, 4, 2], -1)
([3, 2, 1, 4], -1)
([3, 2, 4, 1], 1)
([3, 4, 1, 2], 1)
([3, 4, 2, 1], -1)
([4, 1, 2, 3], -1)
([4, 1, 3, 2], 1)
([4, 2, 1, 3], 1)
([4, 2, 3, 1], -1)
([4, 3, 1, 2], -1)
([4, 3, 2, 1], 1)
我认为这回答了你的问题。我很快就会回到这里,我会找到解释。