stl演算法 next permutation剖析

2021-06-20 13:20:22 字數 1592 閱讀 3518

在標準庫演算法中,next_permutation應用在數列操作上比較廣泛.這個函式可以計算一組資料的全排列.但是怎麼用,原理如何,我做了簡單的剖析.

首先檢視stl中相關資訊.

函式原型:

template

boolnext_permutation(

bidirectionaliterator_first

bidirectionaliterator_last

);template

boolnext_permutation(

bidirectionaliterator_first

,

bidirectionaliterator_last

,

binarypredicate_comp

);

兩個過載函式,第二個帶謂詞引數_comp,其中只帶兩個引數的版本,預設謂詞函式為"小於".

返回值:bool型別

分析next_permutation函式執行過程:

假設數列 d1,d2,d3,d4……

範圍由[first,last)標記,呼叫next_permutation使數列逐次增大,這個遞增過程按照字典序。例如,在字母表中,abcd的下一單詞排列為abdc,但是,有一關鍵點,如何確定這個下一排列為字典序中的next,而不是next->next->next……

若當前呼叫排列到達最大字典序,比如dcba,就返回false,同時重新設定該排列為最小字典序。

返回為true表示生成下一排列成功。下面著重分析此過程:

根據標記從後往前比較相鄰兩資料,若前者小於(預設為小於)後者,標誌前者為x1(位置px)表示將被替換,再次重後往前搜尋第乙個大於x1的資料,標記為x2。交換x1,x2,然後把[px+1,last)標記範圍置逆。完成。

要點:為什麼這樣就可以保證得到的為最小遞增。

從位置first開始原數列與新數列不同的資料位置是px,並且新資料為x2。[px+1,last)總是遞減的,[first,px)沒有改變,因為x2>x1,所以不管x2後面怎樣排列都比原數列大,反轉[px+1,last)使此子數列(遞增)為最小。從而保證的新數列為原數列的字典序排列next。

明白了這個原理後,看下面例子:

int main();

dowhile (next_permutation(a,a+3));

return 0;

}輸出:312/321 

因為原數列不是從最小字典排列開始。

所以要想得到所有全排列

int a =; 

changeto 

int a = ;

另外,庫中另一函式prev_permutation與next_permutation相反,由原排列得到字典序中上一次最近排列。

所以int main();

dowhile (prev_permutation(a,a+3));

return 0;

}才能得到123的所有排列。

**:

STL 演算法細節

一 概論 1 質變演算法 會改變操作物件的值 2 非質變演算法 不改變操作物件的值 3 所有泛型演算法的前兩個引數都是一對迭代器 二 演算法的泛化過程 1 將乙個敘述完整的演算法轉化為程式 是任何訓練有素的程式設計師勝任愉快的工作。2 泛化是乙個漸進過程,從具體到抽象的過程。3 迭代器是乙個行為類似...

STL演算法概述

除了容器類和迭代器,stl還提供了一些通用的演算法與容器類的元素工作。這些讓你做的事情,如搜尋,排序,插入,重新排序,刪除,複製元素的容器類。請注意,作為全球性的功能,操作使用迭代器演算法的實現。這意味著,每個演算法只需要實現一次,它一般會自動工作,提供了一組迭代器 包括自定義的容器類 的所有容器。...

stl 變異演算法

void swap t a,t b swap 交換兩個元素,結果改變實參fwdit remove fwdit first,fwdit last,const t val remove 刪除具有給定值的元素fwdit remove if fwdit first,fwdit last,pred pr 刪除...