全排列在很多程式都有應用,是乙個很常見的演算法,常規的演算法是一種遞迴的演算法,這種演算法的得到基於以下的分析思路。 給定乙個具有n個元素的集合(n>=1),要求輸出這個集合中元素的所有可能的排列。
一、遞迴實現
例如,如果集合是,那麼這個集合中元素的所有排列是,顯然,給定n個元素共有n!種不同的排列,如果給定集合是,可以用下面給出的簡單演算法產生其所有排列,即集合(a,b,c,d)的所有排列有下面的排列組成:
(1)以a開頭後面跟著(b,c,d)的排列
(2)以b開頭後面跟著(a,c,d)的排列
(3)以c開頭後面跟著(a,b,d)的排列
(4)以d開頭後面跟著(a,b,c)的排列,這顯然是一種遞迴的思路,於是我們得到了以下的實現:
#include
"iostream"
using
namespace
std;void
permutation
(char* a,int k,int m)
else }}int
main
(void)
二、stl實現
有時候遞迴的效率使得我們不得不考慮除此之外的其他實現,很多把遞迴演算法轉換到非遞迴形式的演算法是比較難的,這個時候我們不要忘記了標準模板庫已經實現的那些演算法,這讓我們非常輕鬆。stl有乙個函式next_permutation(),它的作用是如果對於乙個序列,存在按照字典排序後這個排列的下乙個排列,那麼就返回true且產生這個排列,否則返回false。注意,為了產生全排列,這個序列要是有序的,也就是說要呼叫一次sort。實現很簡單,我們看一下**:
#include
"iostream"
#include
"algorithm"
using
namespace
std;void
permutation
(char* str,int length)
while(next_permutation(str,str+length));}int
main
(void)
三、有一定約束條件的全排列
對數1,2,3,4,5要實現全排序。要求4必須在3的左邊,其它的數字置隨意。
思路:首先使用上面的2種方法之一實現全排列,然後對全排列進行篩選,篩選出4在3左邊的排列。
#include
"iostream"
#include
"algorithm"
using
namespace
std;void
permutation
(int* a,int length)
if(flag==1) //如果4在3的左邊,執行完**,flag就是1 }while(next_permutation(a,a+length));}int
main
(void)
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!
全排列在很多程式都有應用,是乙個很常見的演算法,常規的演算法是一種遞迴的演算法,這種演算法的得到基於以下的分析思路。 給定乙個具有n個元素的集合(n>=1),要求輸出這個集合中元素的所有可能的排列。
一、遞迴實現
例如,如果集合是,那麼這個集合中元素的所有排列是,顯然,給定n個元素共有n!種不同的排列,如果給定集合是,可以用下面給出的簡單演算法產生其所有排列,即集合(a,b,c,d)的所有排列有下面的排列組成:
(1)以a開頭後面跟著(b,c,d)的排列
(2)以b開頭後面跟著(a,c,d)的排列
(3)以c開頭後面跟著(a,b,d)的排列
(4)以d開頭後面跟著(a,b,c)的排列,這顯然是一種遞迴的思路,於是我們得到了以下的實現:
#include
"iostream"
using
namespace
std;void
permutation
(char* a,int k,int m)
else }}int
main
(void)
二、stl實現
有時候遞迴的效率使得我們不得不考慮除此之外的其他實現,很多把遞迴演算法轉換到非遞迴形式的演算法是比較難的,這個時候我們不要忘記了標準模板庫已經實現的那些演算法,這讓我們非常輕鬆。stl有乙個函式next_permutation(),它的作用是如果對於乙個序列,存在按照字典排序後這個排列的下乙個排列,那麼就返回true且產生這個排列,否則返回false。注意,為了產生全排列,這個序列要是有序的,也就是說要呼叫一次sort。實現很簡單,我們看一下**:
#include
"iostream"
#include
"algorithm"
using
namespace
std;void
permutation
(char* str,int length)
while(next_permutation(str,str+length));}int
main
(void)
三、有一定約束條件的全排列
對數1,2,3,4,5要實現全排序。要求4必須在3的左邊,其它的數字置隨意。
思路:首先使用上面的2種方法之一實現全排列,然後對全排列進行篩選,篩選出4在3左邊的排列。
#include
"iostream"
#include
"algorithm"
using
namespace
std;void
permutation
(int* a,int length)
if(flag==1) //如果4在3的左邊,執行完**,flag就是1 }while(next_permutation(a,a+length));}int
main
(void)
全排列演算法及實現
全排列在很多程式都有應用,是乙個很常見的演算法,常規的演算法是一種遞迴的演算法,這種演算法的得到基於以下的分析思路。給定乙個具有n個元素的集合 n 1 要求輸出這個集合中元素的所有可能的排列。一 遞迴實現 例如,如果集合是,那麼這個集合中元素的所有排列是,顯然,給定n個元素共有n 種不同的排列,如果...
全排列演算法及實現
全排列在很多程式都有應用,是乙個很常見的演算法,常規的演算法是一種遞迴的演算法,這種演算法的得到基於以下的分析思路。給定乙個具有n個元素的集合 n 1 要求輸出這個集合中元素的所有可能的排列。一 遞迴實現 例如,如果集合是,那麼這個集合中元素的所有排列是,顯然,給定n個元素共有n 種不同的排列,如果...
全排列演算法及實現
全排列在很多程式都有應用,是乙個很常見的演算法,常規的演算法是一種遞迴的演算法,這種演算法的得到基於以下的分析思路。給定乙個具有n個元素的集合 n 1 要求輸出這個集合中元素的所有可能的排列。一 遞迴實現 例如,如果集合是,那麼這個集合中元素的所有排列是,顯然,給定n個元素共有n 種不同的排列,如果...