【问题标题】:Merging set of combinations into a larger set (Reverse Combinations)将一组组合合并成一个更大的集合(反向组合)
【发布时间】:2021-03-31 17:03:26
【问题描述】:

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

基本上,假设我们有 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,该案例的主要特征是:

  • L 可以是一个空列表。 (离题)
  • L 总是包含 2 的组合,即对,如果不为空的话。
  • 这些对是对称的,并且只有一对包含在 L 中(没有重复)。也就是说,如果一对 (i, j) 应该包含在 L 中,则对 (i, j) 存在于 L 中并且 (j, i) 永远不会包含,其中 i
  • 在 L, i ∈ D 中从来没有一对 (i, i)。

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

谢谢。

【问题讨论】:

  • 这里n的范围是多少?
  • @AbhinavMathur 好吧,在我的情况下,n 上限为 100(最大),但通常为 n~20。

标签: python python-3.x algorithm combinations graph-theory


【解决方案1】:

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

坏消息是这是a very well-known NP-problem,因此您可能找不到有效的解决方案。好消息是,已经有很多算法可供您用来实施您的解决方案。例如,networkx 包已经实现了an algorithm to find all cliques

所以,你可能应该做的是:

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

【讨论】:

  • 什么是集团?
  • @jurez 好吧,正如我所说,您的问题的措辞方式看起来像是您在要求一个定义。如果你真正想问的是“请你做一下教我关于派系的工作,以便我对它们形成深刻的理解”,那么我的答案是“不”,可能在这里其他任何人都“不”。如果您认为发展这种理解会使这个答案对您更有用,我建议您采取主动并尝试自己了解它们。
  • @jurez 好吧,从我的角度来看,“集团”的定义很简单,与 OP 问题的联系是显而易见的。我意识到“明显”是相对的,我并不打算否定它,但因为这对我来说很明显,所以我无法猜测添加什么会让你更清楚。如果它对包括您自己在内的读者更有用,我很乐意进一步编辑此答案,但您必须更具体地说明需要澄清的内容。
  • @kaya3 所以让我试着改一下我的问题:你能补充一个简短的外行解释,为什么这个问题等同于在无向图中寻找派系?“外行”我的意思是一个知道图论要领的人,但不知道集团的定义。
  • @jurez 我同意需要直观地解释为什么这两个问题是等价的……这就是为什么我在原始答案的第二行中添加了一个问题如何转化为另一个问题的原因。我看不出怎么能比使用图论更直观地解释它。我也看不出具有图论基础知识的人如何无法理解这种解释。在这个问题的上下文中,关于团的理解莫过于它的定义,以及图中的团如何与作为输入的一部分的集合的所有对相关。
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2021-07-16
  • 2021-03-29
相关资源
最近更新 更多