高效率的排列組合演算法

2021-05-01 12:56:57 字數 2306 閱讀 4805

組合演算法

本程式的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標

代表的數被選中,為0則沒選中。

首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。

然後從左到右掃瞄陣列元素值的「10」組合,找到第乙個「10」組合後將其變為

「01」組合,同時將其左邊的所有「1」全部移動到陣列的最左端。

當第乙個「1」移動到陣列的m-n的位置,即n個「1」全部移動到最右端時,就得

到了最後乙個組合。

例如求5中選3的組合:

1 1 1 0 0 //1,2,3

1 1 0 1 0 //1,2,4

1 0 1 1 0 //1,3,4

0 1 1 1 0 //2,3,4

1 1 0 0 1 //1,2,5

1 0 1 0 1 //1,3,5

0 1 1 0 1 //2,3,5

1 0 0 1 1 //1,4,5

0 1 0 1 1 //2,4,5

0 0 1 1 1 //3,4,5  

全排列演算法

從1到n,輸出全排列,共n!條。

分析:用n進製的方法吧。設乙個n個單元的陣列,對第乙個單元做加一操作,滿n進

一。每加一次一就判斷一下各位陣列單元有無重複,有則再轉回去做加一操作,沒

有則說明得到了乙個排列方案。

例如:求1-3的全排列,共3!條

設陣列初始狀態為0 0 0,以下

為計算全排列的步驟:

0 0 0 +1

1 0 0 +1

2 0 0 +1

3 0 0 滿3進1 -

>

0 1 0 +1

1 1 0 +1

2 1 0 +1

3 1 0 滿3進1 -

>

0 2 0 +1

1 2 0 +1

2 2 0 +1

3 2 0 滿3進1 -

>

0 3 0 滿3進1 -

>

0 0 1 +1

1 0 1 +1

2 0 1 +1

3 0 1 滿3進1 -

>

0 1 1 +1

1 1 1 +1

2 1 1 +1

3 1 1 滿3進1 -

>

0 2 1 +1

1 2 1 +1

2 2 1 +1

3 2 1 滿3進1 -

>

0 3 1 滿3進1 -

>

0 0 2 +1

1 0 2 +1

2 0 2 +1

3 0 2 滿3進1 -

>

0 1 2 +1

1 1 2 +1

2 1 2 +1

3 1 2 滿3進1 -

>

0 2 2 +1

1 2 2 +1

2 2 2 +1

3 2 2 滿3進1 -

>

0 3 2 滿3進1 -

>

0 0 3 滿3進1 -

>

0 0 0

共6個yes,每乙個對應一種排列

參考:http://blog.csdn.net/maybehelios/archive/2006/05/28/759315.aspx#698262

全排列問題我的第一意識也是用遞迴:

如1234,排列時分別為第一位取1,2,3,4;如取完1後,剩2,3,4,再分別為第二位取2,3,4;如取2,則剩3,4……這樣遞迴下去即可。有點像數學裡面求乙個全排列總數的方法,即先填第乙個,有5種,再填第二個有4種,最後正好是1*2*3*4=24種。

4選2時:4位二進位制數共有2的4次方種。(該位為1代表組合中含有此數)

0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111,只要找出其中有二個1的即可。更易理解。

第一段演算法是正確的,swy114,那個例子,是錯誤的,因為他只僅僅把第乙個碰到的10,換成01,而沒有把左右所有的1都移動左邊,即從頭再開始填為1.

11000

10100

01100

10010

01010

00110

10001

01001

00101

00011

4個數的

1100

1010

0110

1001

0101

0011

排列組合演算法

在開發的過程中很難免會到排列組合,剛開始通過for迴圈來搞定。但是對於工作了近五年的我而已,不能像 新人那樣做了。如果所要組合的集合大於40,你不可能寫40個for迴圈吧!這裡使用了數學的演算法,到底是啥演算法,高人也沒說!不過我把它的思想提公升了一下。如下 ifndef combination h...

排列組合演算法

1.排列演算法 include define max num 100 void print int n,int num void swap int a,int b int arrange int i,int n,int num i return count int combination int u...

排列組合演算法

組合演算法的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標代表的數被選中,為0則沒選中。初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同時將其左邊的所有 1 全部移動到陣列的最左端。當第...