簡體   English   中英

生成k個大多數子集唯一的元素對

[英]Generate k most subsets unique pair of elements

我正在編寫一個Cuda應用程序,它應該計算我的集合S的兩個元素的函數。但是這對的順序沒有任何區別,所以: f(a,b) = f(b,a)

出於這個原因,我想生成具有最大大小K的S的所有子集,而不重復這些集合之間的元素對。

換句話說,給定任何兩個子集,我不希望它們的交集大於一個元素。 (這樣我可以避免多次計算這兩個元素的功能)

例:

給定S={1,2,3,4,5,6,7,8,9}K=3 ,輸出應該是這樣的:

{ {1,2,3}, {1,4,5}, {1,6,7}, {1,8,9}, {2,4,6}, {2,5,7}, {2,8}, {2,7,9}, {3,4,7},
  {3,5,8}, {3,6,9}, {4,5,9} }

但輸出應該不是這樣的:

{ {1,2,3}, {1,4,5}, {1,6,7}, {1,8,9}, {2,4,6}, {2,5,7}, {2,6,8}, {2,7,9}, {3,4,7},
  {3,5,8}, {3,6,9}, {4,5,9} }

因為{2,4,6}{2,6,8}的交點是{2,6}

我將發布一個非答案,希望它能幫助我們確定問題:我在下面回答的問題是

給定集合S,生成S的所有子集的最大基數集,使得每個子集小於大小K並且沒有兩個子集包含基數> 1的交集。

如果我們修改你想要的子集的大小(k = 3而不是k <= 3),這很容易以非有效的方式進行:

  1. 從S生成大小為k的所有子集
  2. 繼續移除東西,直到沒有交叉點

有些問題來自於此

  1. 有沒有更有效的方法來做到這一點
  2. 修復k會改變此解決方案,始終采用最大尺寸的子集是否最佳
  3. 是否存在最佳集合,以便我們可以選擇大小t <= k並且使所有子集具有該大小

對於2)我認為答案是否定的:

觀察:對於小N,簡單地生成對比生成大小為K的子集更好。生成大小> 2的子集僅消除一對,生成k的子集消除k選擇2對。 選擇大小K只會更好

n/(k choose 2) = k/(k!/(k-2)!2!) = 2n/(k*(k-1)) > (n*n-1)/2 = (n choose 2)
1/(k*(k-1)) > (n-1)/4n

只有足夠大的N才是真的:

1/(k*(k-1)) > 1/4 
  (k*(k-1)) > 4, k>=3

對於3)我認為答案是肯定的

子集的數量在C(n,k)/C(k,2)處最大化,我們可以使用公式來計算它以找到最優k。 如果有剩余的對,我們可以簡單地將它們添加到列表中,就像k = 2一樣

>>> from itertools import combinations, chain
>>> s = {1,2,3,4,5,6,7,8,9}
>>> k = 3
>>> seen = set()
>>> subset_sizes = reversed(range(2,k+1)) # [3,2] for this example. Reversed since you favor the sets with larger values of K
>>> for item in chain.from_iterable(combinations(s,i) for i in subset_sizes):
        pairs = set(combinations(item,2))
        if not pairs.intersection(seen):
            seen.update(pairs)
            print item


(1, 2, 3)
(1, 4, 5)
(1, 6, 7)
(1, 8, 9)
(2, 4, 6)
(2, 5, 7)
(3, 4, 7)
(3, 5, 6)
(2, 8)
(2, 9)
(3, 8)
(3, 9)
(4, 8)
(4, 9)
(5, 8)
(5, 9)
(6, 8)
(6, 9)
(7, 8)
(7, 9)

你可以這樣做 :

    P := {1, 2, 3, 4, 5, 6}; setpartition(P, 3);
   {{{1, 2, 3}, {4, 5, 6}}, {{1, 2, 4}, {3, 5, 6}}, 

     {{1, 2, 5}, {3, 4, 6}}, {{1, 2, 6}, {3, 4, 5}}, 

     {{1, 3, 4}, {2, 5, 6}}, {{1, 3, 5}, {2, 4, 6}}, 

     {{1, 3, 6}, {2, 4, 5}}, {{1, 4, 5}, {2, 3, 6}}, 

     {{1, 4, 6}, {2, 3, 5}}, {{1, 5, 6}, {2, 3, 4}}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM