将一组组合合并成一个更大的集合(反向组合)

Merging set of combinations into a larger set (Reverse Combinations)

我正在尝试创建一个接受子集列表的函数,如果所有组合都存在,则将它们合并成更大的集合。

基本上,假设我们有 n=4(即 index_domain = {0,1,2,3})并且我们有以下组合作为输入

[(0, 2), (0, 3), (1, 3), (2, 3)]

该函数应接受此输入并生成以下输出:

[(0, 2, 3), (1, 3)]

因此,(0, 2, 3) 因为所有组合(2 的组合)都存在于输入列表中。 (1, 3) 保持原样,因为我们没有 1 的另一个组合。

对于索引域D⊆ℕ和输入列表L,案例的主要特征是:

简单来说就是combinations(n, 2)的倒转。我已经搜索过这个主题“反向组合”,但到目前为止我还没有找到合适的资源。我考虑过一些选项,例如对输入进行两次迭代以检查是否所有组合都存在,但这不是最好的方法。我还没有想出一个有效的解决方案。感谢任何有效解决方案的想法。

谢谢。

这道题好像等价于在一个无向图中找出所有cliques的问题。对于输入中的每一对,向图中添加一条边;当图中有一个团时,该团的顶点表示的每一对值集都会出现在输入中。

坏消息是这是a very well-known NP-problem, so you probably won't find an efficient solution. The good news is that there are a lot of algorithms out there already that you can rely on to implement your solution. For example, the networkx package already implements an algorithm to find all cliques

那么,您可能应该做的是:

  1. 将输入转换为图表
  2. 使用算法查找派系
  3. 将找到的派系转换为集合