全排列生成演算法

2021-07-05 12:31:14 字數 1602 閱讀 1674

問題:生成1~n的全排列(生成乙個陣列中所有元素的全排列)。

思想:依據字典序順序,由前乙個排列,生成後乙個排列。

**:

//字典序方法:輸入前乙個排列,輸出後乙個排列

vector

&nextpermutation(vector

&p)

//主呼叫方法

void generatepermutation(int n)

for(int i=0;icout

<< i+1

<< ":";

print(p); //列印陣列

p=nextpermutation(p);

}}

思想:問題分解,n個元素的全排列,可以分解為:

- 1.最左邊的位置(n鐘情況);和

- 2.右邊n-1個元素的全排列。

**:

//遞迴方法,問題分解為其子問題,每次交換首元素和剩下元素中某乙個的位置

void recursiongenerate(vector

&p,int begin,int end)

for(int i=begin;i<=end;i++)

}//主呼叫方法

void generatepermutation2(int n)

recursiongenerate(p, 0, n-1);

}

//對應序號的排列,輸入:排列的序號,輸出:排列

vector

&num2perm(int n,int num)

k*=i+1; //k=n!

}ret.clear();

for(int i=0;i1)/k; //num-1 -> candidate[index]

num-=index*k; //num-=index*k;

ret.push_back(candidate[index]);

candidate.erase(candidate.begin()+index);

}return ret;

}//主呼叫函式

void generatepermutation3(int n)

for(int i=1;i<=num;i++)

}

列印陣列函式

void print(const

vector

&v)

cout

<< endl;

}

問題:如果在上面問題的基礎上,增加了「陣列元素可能重複」的條件。

解法:如果用交換法來解,需要定義乙個set來儲存已經交換過的元素值。

**:

//遞迴方法,問題分解為其子問題,每次交換首元素和剩下元素中某乙個的位置

void recursiongenerate(vector

&p,int begin,int end)

set swap_set;

for(int i=begin;i<=end;i++)

}void generatepermutation2(vector

&p)

全排列生成演算法

recursive generating 這個演算法接受乙個元素均不同的陣列,通過遞迴的呼叫以生成所有全排列序列。遞迴的原則在於,生成序列的全排列p a1,a2,an 等價於生成序列 這構成了遞迴演算法設計的deduction case 而base case,則是要生成全排列的序列只有乙個元素。整個...

全排列生成演算法

我們假如有一串式子,排列組合的結果會有很多種,全排列就是按照字典序有序的將所有的排列組合的性質的陳列出來 問題可以這麼描述 對於給定的集合a,其中的n個元素互不相同,如何輸出這n個元素的所有排列 全排列 我們來這麼看這個問題,加入有n個資料要進行全排列,我們可以假想我們面前有n個盒子 每一次我們有大...

全排列生成演算法 next permutation

全排列的生成演算法有很多種,有遞迴遍例,也有迴圈移位法等等。c stl中定義的next permutation和prev permutation函式則是非常靈活且高效的一種方法,它被廣泛的應用於為指定序列生成不同的排列。本文將詳細的介紹prev permutation函式的內部演算法。按照stl文件...