kwcombinatorics元件文章目錄:
本文今天介紹的.net開源元件是kwcombinatorics,它是.net平台一個高效的生成排列組合序列的開源類庫,它提供了4種生成排列與組合序列的方式。雖然原理和功能都很簡單,但是這個類庫在軟體測試、組合數學以及密碼學等方面都有很大的用處。很早就接觸了這個類庫,以前在一些小程式中也使用過,有時候為了周遊所有可能的組合,自己去寫循環,生成,的确很繁瑣,有了kwcombinatorics 之後,都變得簡單寫了,接下來将詳細介紹該類庫的使用。
本文後面的資源提供了所有源碼和幫助檔案,以及dll檔案的打包下載下傳。可以下載下傳到最新的源代碼和幫助文檔,目前最新的穩定版本是4.0,相比之前又增加了幾個新功能,并進行了一些優化。
該類庫簡單,隻有5個類,dll檔案也隻有幾十kb,下面将介紹幾個主要的功能。
排列組合是組合學最基本的概念:
排列,是指從給定個數的元素中取出指定個數的元素進行排序的所有情況。
組合,是指從給定個數的元素中僅僅取出指定個數的元素,不考慮排序的所有情況。
combination類是根據指定的對象清單,依次升序選擇非重複數字的組合序列,重複是什麼意思呢?就是指定序列中的元素不重複選擇2次。舉個例子:從 0,1,2,3這4個數中,取出3個元素組成序列,那麼共有這麼幾種組合方式:{0,1,2},{0,1,3},{0,2,3},{1,2,3}四種方式,這種情況下,每個組合中,元素隻出現一次,否則的話可以重複,那麼就是這樣{0,0,0},{0,0,1}....
combination類的初始化和使用比較簡單,幾個主要的構造函數如下:
參數主要有下面幾個注意點:
choices:要選擇組合序列的個數
picks:可供選擇的數的個數,如果不提供實際的源資料source,預設就是從0開始的整數;
source:可以直接用初始化清單,而不是固定的從0開始
rank:這個屬性是我認為使用這個元件最強大的地方,因為是按照升序生成所有的組合序列, 而rank就是指定你要選擇的在整個組合序列中目前rank位置的組合序列。下面用幾個例子說明幾個主要方法的使用情況。
設從{0,1,2,3}4個元素中,每次取2個,所有的組合情況有哪些呢?直接上代碼,比較容易看得懂:
運作結果如下:
那有人問,如果想把選擇1-n的組合個數都取出來,怎麼辦?要循環選擇picks一一生成麼?那樣的話當然可以,但這個元件也直接提供了這個功能,看代碼:
注意,這段代碼特意改了2個地方:1個是pciks選3,而擷取的方法是getrowsforallpicks,不是簡單的getrows。它的作用就是把所有pick的情況都包括了,看看結果:
上述例子很清楚的說明了n選k的組合情況。choices為數字,好辦,那如果是其他對象清單,要進行組合選擇,那該如何辦?構造函數也沒有直接用對象清單作為選擇源的啊?其實很簡單,其原理是:先擷取對應 對象清單 長度l,和要選擇對象個數的k 的組合對象combination (l,k),然後和第2節中的getrows一樣,循環,将每一個combination的選擇作為模版,使用permute方法将模版應用到對象清單中,選擇出對應位置的對象,進行組合。
為了簡單明了,上代碼:
當然其他對象也類似,大家可以依次類推。
這個功能也是差別于個人手寫的最大亮點,是以一個成熟的功能元件是需要很多付出的,哪怕是一個小功能。關注和使用這個元件的時間超過4年,再次向作者表示感謝。可謂是麻雀雖小五髒俱全。前面已經介紹了,rank就是相對與所有組合的一個順序号(升序),而上面介紹的都是通過ienumerable來一次擷取所有組合,但如果隻需要擷取指定位置的組合咋辦,看代碼:
結果如下,對比結果和代碼,應該很容易了解:
同樣,還可以通過picks屬性來擷取每一個組合中所有的元素,如:
與combination功能一樣,結構也一樣。隻不過選擇是可以重複,combination是不重複的。 代碼都差不多,就不貼了,有興趣的朋友自己去試試看。
接下來的幾篇文章将繼續介紹該元件的其他功能。
寫篇文章不容易,如果對您有幫助,順手點個【推薦】吧。