您的位置:首页 > 其它

STL:next_permutation (UVaOJ 146)

2012-07-18 22:09 218 查看
STL中,next_permutation( first, last ) 可以把[ first, last)中的序列,变成下一个全排列。

如果序列没有下一个全排列,就返回false,否则返回true。

至于全排列是什么,可以查阅百度百科。(传送门

而 next_permutation( ) 对我们的序列做了什么呢?

将一个全排列变成下一个全排列的时候,我们可以这样做。

从后往前找,找到一个元素Ai,发现这个元素后面有比他大的元素,其中最小的为Aj。

交换Ai和Aj两个元素的位置,一定可以得到一个比原来大的全排列。

我们要找的下一个,就是比原来全排列只大1的全排列。

我们可以把元素Ai后面的序列排序。

这样,我们就可以得到比原全排列大的所有全排列中最小的那个。

那么就是我们要的,只比原来全排列大1的全排列。

如果找不到这样Ai,就不存在下一个全排列。

而 next_permutation( ) 做的是这样的事。

从后往前找,找到两个相邻的元素 Ai 和 Aii 满足 Ai < Aii。

然后再次从后往前找,找到第一个大于Ai的元素Aj。

交换Ai和Aj的位置,然后讲Aii及Aii后面的元素逆向排列。

我们可以模拟这个过程,发现它的做法和我们的做法差不多,并且更高效。

同时,在STL还有另一个函数 prev_permutation( ),它正好和 next_permutation( ) 相反,是求前一个全排列。

还有要注意的是,当 prev_permutation( ) 和 next_permutation( ) 返回false的时候,序列依然会被改变。

并且会发生回绕,即像 int 一样,最后一个的后面一个,会是第一个,第一个的前面一个会是最后一个。

参考资料:《STL源码剖析》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  permutation 百度