Next_permutation和效率

时间:2011-07-11 14:36:29

标签: c++ stl

从一个范围内的对象的可能随机排序开始,使用next_permutation逐步执行所有更大的排列,然后逐步降低,再次使用原始排序,使用prev_permutation到达最后一个排序,是否更有效率。

或者,在置换之前对范围进行排序,然后仅使用next_permutation来逐步完成所有这些操作?

3 个答案:

答案 0 :(得分:8)

next_permutation将逐步执行所有排列,而不仅仅是更高排列。无需恢复和使用prev_permutation,当然也不需要排序。

您只需要注意next_permutation一旦“翻转”到按字典顺序排列的最低排列,就会返回false这一事实,因此您需要跟踪当前排列的数量才能知道何时停止。

也就是说,无论起始范围如何,以下内容都将遍历范围的所有可能排列。

size_t const num_permutations = multinomial_coefficient(range);

for (size_t i = 0; i < num_permutations; ++i) {
    next_permutation(range.begin(), range.end());
    // use permutation.
}

其中multinomial_coefficient是范围内不同元素数量的multinomial coefficient。在所有元素都不同的简单情况下,这相当于 N !,元素数量的阶乘。

答案 1 :(得分:2)

要获取所有排列,请从排序范围开始,然后

do
{
  // something
} while(next_permutation(range.begin(), range.end());

当范围再次排序时停止。这个过程是O(n!)。

当你从随机范围开始时,你会错过一些排列。

答案 2 :(得分:-1)

完全没有区别,算法不会重复使用以前的结果,所以不需要事先排序。