C++语言基础 —— STL —— 算法 —— 排列组合算法
【概述】
首先要了解什么是 “下一個” 排列組合,什么是 “上一個” 排列組合。
假設有三個數字組成的序列:{a,b,c}
則這個序列有6種可能的排列組合:abc、acb、bac、bca、cab、cba
上述的排列組合是根據 less-than 操作符做字典順序的排序,即:abc 處于第一,每一個元素都小于其后的元素,而 acb 是次一個排列組合,它是固定了序列內最小元素( a )之后所做的新組合。
同理,序列中次小元素( b )而做的排列組合,在次序上將先于那些固定最小元素( c )而做的排列組合,以 bac、bca 為例,bac 在 bca 之前,因為次序 ac 小于序列 ca ,因此,對于 bca,可以說其前一個排列組合是 bac,其后一個排列組合是 cab。
要注意的是,處于排列首的序列 abc 沒有 “前一個” 排列組合,處于排列尾的序列 cba 沒有“后一個”排列組合。
【STL 中提供的算法】
STL 提供了兩個用來計算排列組合關系的算法,分別是 next_permutation() 與 prev_permutation()
其中,next_permutation()?是取出當前范圍內的排列,并重新排序為下一個排列,prev_permutation() 是取出指定范圍內的序列并將它重新排序為上一個序列。如果不存在下一個序列或上一個序列則返回 false,否則返回 true
這個算法有兩個版本,其一使用元素類別所提供的操作符來決定下一個或上一個排列組合,其二是以仿函數 comp 來決定
1.算法思想
以?next_permutation() 為例:
假設存在序列{0,1,2,3,4},下圖即為尋找全排列的過程
2.next_permutation() 的用法
對于給定的任意一種排列組合,如果能求出下一個排列的情況,那么求得所有全排列情況就容易了。
利用 next_permutation() 的返回值,通過判斷排列是否結束,即可求出全排列。
int a[N]; void all_permutation(int n) {sort(a,a+n);do{for(int i=0; i<n; i++)printf("%d ",a[i]);printf("\n");}while(next_permutation(a,a+n)); }3.next_permutation() 與?prev_permutation() 的區別
next_permutation()?函數默認的是從小到大的順序,而 prev_permutation() 函數默認的是從大到小的順序。
例如:對于序列 {3,1,2}
用 next_permutation()?函數得到的結果是:312、321
用?prev_permutation() 函數得到的結果是:312、231、213、132、123
?
總結
以上是生活随笔為你收集整理的C++语言基础 —— STL —— 算法 —— 排列组合算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小总代价(洛谷-U17433)
- 下一篇: Lake Counting(信息学奥赛一