一些常用集合演算法 之組合生成

2021-05-28 00:42:38 字數 1205 閱讀 9356

【**:

一些常用集合演算法——之組合生成

在開發過程中常常需要處理集合,因此我寫了一些常用演算法,貼出大家提提意見。

本帖介紹組合生成演算法。

開乙個陣列,陣列元素的值為1表示其下標代表的數被選中,為0則沒選中。

首先初始化,將陣列前m個元素置1,表示第乙個組合選中前m個元素。

然後找到從左到右的第乙個「10」組合,將其變為「01」組合,

同時將其左邊的所有「1」全部移動到陣列的最左端,例如:

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

具體實現的時候,不需要每次「從左往右掃瞄」——我們可以這樣考慮:每次將「10」變為「01」,可能產生新的翻轉位置,那麼就只需要記錄新的翻轉位置。

public static listcombination(ilistlist, int n)

return combs;

}

其中:
《新增生成的組合》**為:
int cnt = 0;

var newcomb = new t[ n ];

foreach (var index in selection) newcomb[cnt++] = list[index];

combs.add(newcomb);

《將i左邊這些連續的1全部移動到最左》**為:
if (i >= 2)

}

輸入abcdef,選3個:

1:abc  2:dab  3:dac  4:dbc  5:abe  6:ace  7:bce  8:ade  9:bde  10:cde  11:abf  12:acf  13:bcf  14:adf  15:bdf  16:cdf  17:aef  18:bef  19:cef  20:def

網上大多是「掃瞄演算法」,這裡用「翻轉點」做了改進——不斷構造新的翻轉點,直到沒辦法再翻轉。

一些集合演算法

setalgorithm.cs 1 using system 2namespace rabbit.tools325 26static bool arrangement int n,int rlen,int result,setalgorithmcallback callback 2743 44 45...

c STL之常用集合演算法

set intersection 求兩個容器的交集 set union 求兩個集合的並集 set difference 求兩個集合的差集 1.set intersection includeusing namespace std include include 常用集合演算法 set interse...

常用的一些操作集合

一 python內建函式的使用 內建函式就是python自帶的函式,我們經常使用的內建函式有 簡單列幾個常用的函式 input print set bool abc bool max max 1,8,6,7,8,765,44,888,999,100000 min min 1,8,6,7,8,765,...