Python 生成k个最子集唯一的元素对

Python 生成k个最子集唯一的元素对,python,math,parallel-processing,combinatorics,discrete-mathematics,Python,Math,Parallel Processing,Combinatorics,Discrete Mathematics,我正在编写一个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

我正在编写一个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),您可以这样做:

    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}}}

请您花点时间写下您的问题好吗?它应该包含一个;对问题是什么的清晰描述和描述。我想您可能无意中遗漏了问题的某些部分。这可能是一个有趣的问题,我真的不明白为什么必须关闭它。在您确定您要查找的内容后重新发布更具体一点。不要转发;编辑问题。已经有重新打开它的投票。继续编辑。问题:1)你说的是“配对”,但你的例子涉及到三胞胎(但只有一对)。你想要哪一个?二者都单身人士也是吗?2) 您的示例不包含所有可能的组合,只包含其中的一些组合。你想要所有可能的组合吗?只有一些?我们如何决定哪一个?3) “我更喜欢二进制的东西”是什么意思?@user1363214在这里转载了我的最后一条评论:我认为你的谓词中有一个非交换的问题;从你最初的问题中得到一个例子,你想用什么规则来区分{2,4,6}和{2,6,8}:你期望{2,4,6},{2,8},但为什么不期望{2,4},{2,6,8}。。。我认为我们在这里浪费时间:我们只是没有从OP中得到他需要在S=1,2,3,4,5和K=3的1,2,3,1,2,4,1,2,5之间进行选择。OP显然缺少他没有提供的总订单函数。@Boud-同意。我在解决这个问题,好像他不在乎,他只是想要最大集,这仍然是一个有趣的问题。如果事实证明没有关系,我会用核武器回答:)
1/(k*(k-1)) > 1/4 
  (k*(k-1)) > 4, k>=3
>>> 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}}}