从一个范围内的对象的可能随机排序开始,使用next_permutation逐步执行所有更大的排列,然后逐步降低,再次使用原始排序,使用prev_permutation到达最后一个排序,是否更有效率。
或者,在置换之前对范围进行排序,然后仅使用next_permutation来逐步完成所有这些操作?
答案 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)
完全没有区别,算法不会重复使用以前的结果,所以不需要事先排序。