2012-05-30 44 views
1

我正在研究一個應用程序,我想要採用M中所有可能的k元素組合的集合C(用|| M | | = m),並用M的子集N_i的k個組的集合覆蓋C,其中|| N_i || = n < m∀N_i算法覆蓋M的子集與M的組合k的集合

所以有(m選擇k)組合覆蓋,並且n個元素的每個集合Q_i將包含(n個選擇k個)組合。

我想是,構建組齊,使得q被最小化的算法(即,儘可能接近(米選擇K)/(N選擇K)越好)

因此,例如,如果m = 100,k = 3,n = 10,我會想要10組元素的最小集合,使得它們各自的3組合集合覆蓋了(100選3)3組合的M.

+0

有趣的問題。僅僅因爲好奇心,你爲什麼想要構建更小的集? – bacchus

+0

@bacchus它實際上是相當複雜的解釋,但要點是,每個M的元素代表了一個布爾事件,所以在M中的一組可能的狀態是2^M。如果我可以將M分解爲N的這些集合,|| N || = n Tom

回答

1

I交叉貼this question on Math Overflow

事實證明,這是在組合一個良好的踐踏問題叫覆蓋設計親blem

一般來說,沒有保證最小值的算法,儘管有算法非常接近最小值。你可以找到現有的已知覆蓋物和研究here

+0

+1,用於在找到問題時發佈問題的答案。 –

1

我不確定這是否有用,但我寫了一個類來處理二項係數的常用函數,這是您的問題類型問題屬於。它執行以下任務:

  1. 以良好的格式輸出所有K指數爲任何N選擇K到文件。 K-index可以用更多的描述性字符串或字母來代替。這種方法使得解決這種類型的問題非常簡單。

  2. 將K索引轉換爲排序二項式係數表中條目的正確索引。這種技術比依靠迭代的較早發佈的技術要快得多。它通過使用Pascal三角形中固有的數學屬性來做到這一點。我的論文談論這個。我相信我是第一個發現和發佈這種技術的人,但我可能是錯的。

  3. 將排序後的二項式係數表中的索引轉換爲相應的K索引。

  4. 使用Mark Dominus方法來計算二項式係數,這是不太可能溢出和更大的數字作品。

  5. 該類使用.NET C#編寫,並提供了一種通過使用通用列表來管理與問題(如果有)相關的對象的方法。這個類的構造函數接受一個名爲InitTable的布爾值,當true時將創建一個通用列表來保存要管理的對象。如果此值爲false,則不會創建表。該表不需要創建以執行上述4個方法。提供Accessor方法來訪問表。

  6. 有一個關聯的測試類,顯示如何使用該類及其方法。它已被廣泛測試2例,並沒有已知的錯誤。

要了解關於此類和下載代碼的信息,請參見Tablizing The Binomial Coeffieicent

將此類轉換爲您選擇的語言並不困難。

從你對問題的描述看來,你應該爲N設置一個循環(如果K也是另一個循環),然後爲該N,K組合創建一個二項式係數對象(BC)。用BC對象調用無符號長版本的GetBinCoeff()以獲得組合的總數。然後設置另一個循環來遍歷每個BC對象的總數。在該循環內部,調用BC GetKIndexes方法獲取每個索引(即組合)的K指數,然後進行計算。我不確定你想盡量減少什麼。如果我的建議不夠清楚或者不夠有用,請嘗試發佈更詳細的示例,以清楚地顯示您正在查找的結果。