STL庫全排列演算法next permutation

2021-06-28 22:23:23 字數 1684 閱讀 8008

1.next_permutation 函式原型

templatebool next_permutation(  

bidirectionaliterator _first,

bidirectionaliterator _last

);

templatebool next_permutation(

bidirectionaliterator _first,

bidirectionaliterator _last,

binarypredicate _comp

);

由函式模板可知,next_permutation返回值為bool型,模板2第三個引數用來表示比較方式,預設形式為小於,當找到下乙個全排列序列時返回值為真,若沒找到則返回值為假。

(這裡解釋下何時為找到:對於序列(1,2,3),預設的所有全排列方式為((123),(132),(213),(231),(312),(321)),即當輸入為前5個序列時,均能找到下乙個排列方式的序列,返回值為真,輸入序列為最後(321)時,無下一排列方式序列,返回值為假)

2.next_permutation實現原理

對於乙個序列進行全排列,如(123),我們自然會得到((123),(132),(213),(231),(312),(321))所有可能,在書寫排列方式的過程中,我們是先將1固定,然後排23,然後2換置第一位,再排13,最後3換置第一位,排12。我們看乙個較長的序列(23154),如何找到它下乙個序列呢?我們從序列尾部開始依次向前尋找,找到第乙個相鄰兩數(i,ii)滿足如下條件i原理分析:

1.依次向前尋找第乙個相鄰兩個數(i,ii)滿足(i*>*>*>...)

2.從尾部開始尋找第乙個大於i的數j,交換i,j位置,由於j是(第乙個)大於i的數,交換後保證了序列整體的最小遞增性(相當於先確定了遞增性的最高位)

3.反轉ii以及之後序列:使ii及之後序列遞增排列,從而確保了低位的最小遞增性

4.若序列已經全部降序排列(即i=first),反轉序列,返回false

templatebool next_permutation(  

bidirectionaliterator first,

bidirectionaliterator last

)

if(i == first)

} }

3.應用**及結果

#include#include#include#include#includeusing namespace std;

int main()

; v1.assign(dim1,dim1+3);

cout<<"vector v1 : "<(cout,", " ));

cout<(cout,", " ));

cout<(cout,", " ));

cout<(cout,", " ));

cout<

4.小結

stl庫中next_permutation演算法用來輸出序列的全排列比較方便,需注意輸入序列(數字或字母)為公升序時才能得到全部的排列組合,使用時需要包含標頭檔案,當找到最後序列,即全為降序排列時,返回false,序列全部逆轉,變為初始的公升序排列。,prev_permutation演算法的用法類似,只不過是尋找全排列序列中輸入序列之前的序列。

STL 全排列問題

擅長排列的小明 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述小明十分聰明,而且十分擅長排列計算。比如給小明乙個數字5,他能立刻給出1 5按字典序的全排列,如果你想為難他,在這5個數字中選出幾個數字讓他繼續全排列,那麼你就錯了,他同樣的很擅長。現在需要你寫乙個程式來驗證擅長排...

演算法基礎 使用STL實現全排列

stl是標準模版庫的縮寫,是泛化程式設計的實現,基本觀念是將資料和操作進行分離,資料使用容器進行管理,操作由演算法進行實現,迭代器在兩者之間進行溝通,使得任何演算法和任何容器都有可能進行互動運作。這篇文章以乙個簡單的例子進行介紹stl使用上的便利之處。比如通過臨位對換方式實現的全排列,可能如下 in...

STL中的全排列函式實現全排列

標頭檔案 inlcude這裡先說兩個概念 下乙個排列組合 和 上乙個排列組合 對序列 每乙個元素都比後面的小,按照字典序列,固定a之後,a比bc都小,c比b大,它的下乙個序列即為,而的上乙個序列即為,同理可以推出所有的六個序列為 其中沒有上乙個元素,沒有下乙個元素。a.函式模板 next permu...