【**:
一些常用集合演算法——之組合生成
在開發過程中常常需要處理集合,因此我寫了一些常用演算法,貼出大家提提意見。
本帖介紹組合生成演算法。
開乙個陣列,陣列元素的值為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,...