如果我有N個不同的數字,他們將被分成k個大小的子集,這樣每個子集至少有一個共同的元素。請幫助我的算法。輸出應該是這樣的 如果我有從1到5和k = 3
元素一些東西則輸出應該是:將N個元素分成k個大小的子集
- S0 = {0, 1, 2}
- S1 = {1, 3, 5}
- S2 = {2, 4, 5}
- S3 = {0, 3, 4}
- S4 = {1, 4, 6}
- S5 = {0, 5, 6}
- S6 = {2, 3, 6}
如果我有N個不同的數字,他們將被分成k個大小的子集,這樣每個子集至少有一個共同的元素。請幫助我的算法。輸出應該是這樣的 如果我有從1到5和k = 3
元素一些東西則輸出應該是:將N個元素分成k個大小的子集
- S0 = {0, 1, 2}
- S1 = {1, 3, 5}
- S2 = {2, 4, 5}
- S3 = {0, 3, 4}
- S4 = {1, 4, 6}
- S5 = {0, 5, 6}
- S6 = {2, 3, 6}
1)注意,如果k = 1
和|S| > 1
然後這是不可能的(即k = 1
和S = {1,2}
)
2)否則,取第一個數字,將其作爲每個子集中的第一個數字始終添加,然後用剩餘的數字填充子集。如果沒有足夠的數字填寫最後一個子集,只需使用隨機數填寫即可。
按照您的例子k = 3
和S = {0,1,2,3,4,5,6}
我們可以這樣做:
S0 = {0,1,2}
(第一號+未來2)S1 = {0,3,4}
(第一號+未來2後1,2
)S2 = {0,5,6}
(在這種情況下,我們很幸運,因爲我們能夠填寫S2,否則應該只爲0 .. 5
我們可以添加一個隨機數作爲最後一個)你的例子有7個點(0,...,6)和7個「行」(例如,「行」{0,1,2})。請注意,任何兩條線「交叉」在一個點上,任何兩點確定一條線。 (從0,...,6中挑選兩個數字,您會看到只有一組數字和這兩個數字。)
因此,您提出的設計有比您所描述的更多的限制。如果你只是想子集的每對有至少一個共同的元素,你可以把0到每個set和get Ç 2個子集{0,1,2},{0,1 ,3},{0,1,4}等等,這並不難。
點和線的幾何語言不是巧合。如果你想要一個每一對子集都有一個共同元素的設計,你可能需要一個投影平面。你給的例子叫做法諾飛機。對於N和k的所有組合,射影平面是不可能的。您必須具有N = m^2 + m + 1和k = m + 1,其中m被稱爲飛機的訂單。使用模運算(例如,m = 2給出Fano平面),通過用於m素數的「向量空間構造」可以容易地構建投影面。他們稍微難以使用向量空間構造和有限域來構造素數的冪,m = p^k。細節可以在許多不同的參考文獻中找到。
對於其他訂單,很少有人知道,除了通過蠻力計算可知,有訂單6沒有射影飛機和10
這是你想要的嗎?如果沒有,還有其他的「組合塊設計」可能具有你想要的屬性,但你必須精確地滿足你的需求。
' - S4 = {1,4,6}'是怎麼發生的? 5個不同的數字,我認爲他們是從1到5。你的問題是指「從n個不同的項目中選擇k個不同的項目」的組合? http://en.wikipedia.org/wiki/Combination – coderz
你有元素1到5,但你的集合還包括0和6? –
1)你說'1到5',但在你的例子中你有0和6? 2)我們是否需要分發所有數字? 3)我們是否應該儘量減少子集的數量? –