签名next_permutation c ++

时间:2017-05-12 01:28:37

标签: c++ std permutation

我想知道是否有一种简单的方法可以知道c ++&#39; 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()));
}

或者,是否有内置函数来确定置换的奇偶性?

1 个答案:

答案 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)

我认为这回答了你的问题。我很快就会回到这里,我会找到解释。