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源码剖析》
如果序列没有下一个全排列,就返回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源码剖析》
相关文章推荐
- Orders(C++ stl next_permutation)
- STL的应用 multiset bitset next_permutation
- C++ STL next_permutation
- HDU 1716 排列2 (stl,next_permutation)
- C++STL的next_permutation 的用法
- HDU1716 -- 全排列 -- STL -- next_permutation()
- 【STL】全排列生成算法:next_permutation
- stl算法:next_permutation剖析
- NYOJ 19 擅长排列的小明 (STL之next_permutation()的使用)
- 可重集的排列:投机取巧的做法,利用STL的next_permutation
- 打印全排列和stl::next_permutation
- STL next_permutation
- 【ny-oj】-366-D的小L(STL-全排列(next_permutation()))
- STL学习笔记之next_permutation(下一个排列)
- C++STL的next_permutation
- STL中的全排列next_permutation
- STL的排列算法next_permutation
- [STL] next_permutation 的原理和使用
- 蓝桥杯 - 算法提高 排列数 【STL-next_permutation求全排列】
- C++ STL next_permutation的实现原理