每天乙個演算法 全排列演算法

2021-07-31 20:06:12 字數 1266 閱讀 2570

全排列演算法:給出乙個有n個元素的集合,求出這個集合所有可能的排列。

一、 遞迴的方法

void  permutation(char *arr, int k , int m)

cout

} }

二、 stl實現

有時候遞迴的效率使得我們不得不考慮除此之外的其他實現,很多把遞迴演算法轉換到非遞迴形式的演算法是比較難的,這個時候我們不要忘記了標準模板庫已經實現的那些演算法,這讓我們非常輕鬆。stl有乙個函式next_permutation(),它的作用是如果對於乙個序列,存在按照字典排序後這個排列的下乙個排列,那麼就返回true且產生這個排列,否則返回false。注意,為了產生全排列,這個序列要是有序的,也就是說要呼叫一次sort。stl提供的next_permutation()函式大大簡化了程式設計,這是乙個十分有用的函式。此外與之對應的還有prev_permutation()函式,可以得到上乙個全排列。這讓全排列實現起來很簡單,我們看一下**:

void permutation(char* str,int length)  

三、有一定約束條件的全排列

對數1,2,3,4,5要實現全排序。要求4必須在3的左邊,其它的數字置隨意。思路:首先使用上面的2種方法之一實現全排列,然後對全排列進行篩選,篩選出4在3左邊的排列。

void permutation(int* a,int length)  

if(flag==1) //如果4在3的左邊,執行完**,flag就是1

四: next_permutation的原理

next_permutation()函式是按照字典序的順序得出比當前排列大,且最靠近當前排列的下乙個排列。

函式實現原理如下:在當前序列中,從尾端往前尋找兩個相鄰元素,前乙個記為*i,後乙個記為*ii,並且滿足*i < *ii。然後再從尾端尋找另乙個元素*j,如果滿足*i < *j,即將第i個元素與第j個元素對調,並將第ii個元素之後(包括ii)的所有元素顛倒排序,即求出下乙個序列了。**如下:

templatebool next_permutation(  

bidirectionaliterator first,

bidirectionaliterator last

)

if(i == first)

} }

每天乙個演算法題 開篇

今天,作為乙個重要時間節點,要開始新的人生了。雖然明天正好趕上婦女節什麼的,但是跟這個沒什麼關係。對於職業規劃依然不是很明朗。有乙個被斃掉的面試至今刻骨銘心,但是也算是乙個重要的提醒,就是想要讓人看得起,首先得有能力,要不斷地學習和儲備。要不斷努力,才不會在機會來臨時白白錯過。部落格新加了乙個分類 ...

每天乙個演算法之移位運算

public class bitwise 正數的左移會到0,負數的左移只能讓1越來越多。這是因為左移對應數的減小,負數會越減越小,不可能等於0 public static int bitmove0 int n n n 1 return count 為了克服這個問題,我們可以讓標誌1右移,效果是一樣的...

每天乙個演算法之指數運算

package ff 最爛的方法是乙個for迴圈解決,每次都乘以底數。這種誰都能想出來的方法可以忽略。public class power 這個是比較好的方法。使用到了分治遞迴,考慮到偶數和奇數的情況。指數是偶數時是半 半,奇數時是半 半 底數。時間複雜度lgn public static int ...